一道简单的DP,但是状态一开始没想出来,用了3个二维数组,后来发现可以4维数组直接转移,想出状态来方程就特别好写了,不要形成思维定势,对于状态多思考一下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define max(a,b) (a>b?a:b)
using namespace std;
int n,m,dp[52][52][52][52],a[60][60];
int main()
{
//freopen("std.in","r",stdin);
memset(dp,0,sizeof(dp));
cin>>m>>n;
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
{
for (int i2=1;i2<=m;i2++)
{
for (int j2=1;j2<=n;j2++)
{
if (i<m&&j<n&&i==j==i2==j2)continue;
int tmp=0;
if (i-1!=i2&&j!=j2-1)tmp=dp[i-1][j][i2][j2-1]+a[i][j]+a[i2][j2];
if (i!=i2-1&&j-1!=j2)tmp=max(tmp,dp[i][j-1][i2-1][j2]+a[i][j]+a[i2][j2]);
tmp=max(tmp,dp[i-1][j][i2-1][j2]+a[i][j]+a[i2][j2]);
dp[i][j][i2][j2]=max(tmp,dp[i][j-1][i2][j2-1]+a[i][j]+a[i2][j2]);
}
}
}
}
cout<<dp[m][n-1][m-1][n];
return 0;
}