题目链接:https://www.acwing.com/problem/content/description/277/
方格取数中, 在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
在传纸条中, 班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙,反之亦然。
方格取数中,经过的点可以再次经过,只不过没有数可以取了,只能取0了。在传纸条中,传过一次的人第二次就不会帮忙了,传到这里就卡住了。这俩看起来还是存在不同的。现在证明在取到最优解的时候,来回的两条路线不会有交叉,方格取数的最优解中也不会有交叉。所以这道题也可以用方格取数来做。
参考链接:AcWing 275. 证明传纸条为何可以使用方格取数的代码
问:
答:
代码:
//这道题和方格取数是一样的,收藏了题解,有证明
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=55;
int n, m;
int g[N][N];
int f[N*2][N][N];
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d", &g[i][j]);
for(int k=2; k<=n+m; k++)
for(int i=1; i<k; i++)
for(int j=1;j<k;j++){
int &v = f[k][i][j];
int tmp = g[i][k-i];
if(i!=j){
tmp += g[j][k-j];
}
v = max(f[k - 1][i - 1][j], v);
v = max(f[k - 1][i - 1][j - 1], v);
v = max(f[k - 1][i][j - 1], v);
v = max(f[k - 1][i][j], v);
v += tmp;
}
printf("%d\n", f[n+m][n][n]);
return 0;
}