题目
luogu1006
vijos1493
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 60
using namespace std;
int n,m,mp[N][N];
int f[N][N][N][N];//f[i][j][l][r]表示两张纸分别传到(i,j)和(l,r)的最大好心程度
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++) scanf("%d",&mp[i][j]);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
for(int l=1;l<=m;l++)
for(int r=1;r<=n;r++)
{
int t=max(f[i-1][j][l-1][r],max(f[i-1][j][l][r-1],max(f[i][j-1][l-1][r],f[i][j-1][l][r-1])));
if(i==l&&j==r)//若两张纸条传至相同的地方,只记录一次的值,那么这必然不会是最优情况,会在后续被更新,所以路径不会重复
f[i][j][l][r]=t+mp[i][j];
else f[i][j][l][r]=t+mp[i][j]+mp[l][r];
}
printf("%d",f[m][n][m][n]);
return 0;
}