题目大意:
给定一张n*n的图,要求从左上角走到右下角,再从右下角走到左上角。每个点都有一个值,要求最大路径值,并且来回的路不能重复的点。
思路:
朴素做法是四维数组,dp[1][2][3][4]前两维是第一个点的坐标后两维是第二个点的坐标。
反思:
有个疑问,为什么最后的输出顺序是dp[n][m-1][n-1][m]而不能是dp[n-1][m][n][m-1]。
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=60;
int box[MAXN][MAXN];
int ans[MAXN][MAXN][MAXN][MAXN];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&box[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
for(int p=j+1;p<=m;p++){
int aa=max(ans[i-1][j][k-1][p],ans[i-1][j][k][p-1]);
int bb=max(ans[i][j-1][k-1][p],ans[i][j-1][k][p-1]);
ans[i][j][k][p]=max(aa,bb)+box[i][j]+box[k][p];
}
}
}
}
printf("%d",ans[n][m-1][n-1][m]);
}