sdnu oj 1194 传纸条 双线程DP

从左上角到右下角一条+从右下角到左上角一条
==从左上角到右下角两条 2333

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <queue>
#include <map>
#define mod 1000000007
using namespace std;

typedef long long ll;
const int N = 52;
const long long inf = 0x3f3f3f3f;
const double eps = 1e-5;
const double pi = acos(-1);

int a[N][N], f[N][N][N][N];

int main()
{
    int m, n, i, j, k, p;
    scanf("%d%d", &m, &n);
    for(i = 1; i <= m; ++i)
        for(j = 1; j <= n; ++j)
            scanf("%d", &a[i][j]);
    for(i = 1; i <= m; ++i)
        for(j = 1; j <= n; ++j)
            for(k = 1; k <= m; ++k)
            {
                int p = i+j-k;        //略做优化
                if(p >= 1 && p <= n && i < k)     //保证在范围内,且i、j 路线偏右上, k、p 路线偏左下,保证不会重叠相交 
                {
                    int tmp1 = max(f[i][j-1][k][p-1], f[i][j-1][k-1][p]);    //f[i][j-1] 确定的情况下,  找 [k][p]较优解
                    int tmp2 = max(f[i-1][j][k][p-1], f[i-1][j][k-1][p]);    //f[i-1][j] 确定的情况下,  找 [k][p]较优解 
                    tmp1 = max(tmp1, tmp2);          //找出四个可能里最大的
                    f[i][j][k][p] = max(f[i][j][k][p], tmp1 + a[i][j] + a[k][p]);        //加上此处的好感值
                }
            }
    printf("%d\n", f[m-1][n][m][n-1]);           
    return 0;
}
发布了40 篇原创文章 · 获赞 4 · 访问量 1127

猜你喜欢

转载自blog.csdn.net/xiongshuxian2019/article/details/104458060