$\huge \color{orange}{成魔之路->}$ $\huge \color{purple}{算法提高课题解}$
可参考: 方格取数
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int n,m;
int w[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++)
cin>>w[i][j];
for(int k=1;k<=n+m;k++)
for(int i1=1;i1<=n;i1++)
for(int i2=1;i2<=n;i2++)
{
int j1=k-i1,j2=k-i2;
//必须合法并且不能走到同一个点上(起点和终点除外)
if(j1>=1&&j1<=m&&j2>=1&&j2<=m&&(i1!=i2||k==2||k==n+m))
{
int t=w[i1][j1]+w[i2][j2];
// 1 号和 2 号都往下走
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2-1]+t);
// 1 号往下走,2 号往右走
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2]+t);
// 1 号往右走,2 号往下走
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2-1]+t);
// 1 号和 2 号都往右走
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2]+t);
}
}
cout<<f[n+m][n][n]<<endl;
return 0;
}