易错点:
- 因为好感度最低为零且一定有答案,不需要额外处理好感度为零的位置.
- dp[i][x1][x2]=max(dp[i-1][x1][x2],…,dp[i-1][x1-1][x2-1]).
#include<cstdio>
#include<iostream>
using namespace std;
const int MAXN=105;
int a[MAXN][MAXN];
int dp[MAXN][MAXN][MAXN];
int main(){
int m,n;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
int value=m+n-1;
for(int i=1;i<=value;i++)
for(int x1=1;x1<=m;x1++)
for(int x2=1;x2<=m;x2++){
int y1,y2;
y1=i-x1+2,y2=i-x2+2;
dp[i][x1][x2]=max(
dp[i-1][x1][x2],max(
dp[i-1][x1][x2-1],max(
dp[i-1][x1-1][x2],
dp[i-1][x1-1][x2-1])))
+a[x1][y1]+a[x2][y2];
if(x1==x2&&y1==y2)dp[i][x1][x2]-=a[x2][y2];
}
printf("%d\n",dp[value][m][m]);
return 0;
}