和方格取数的分析一样
#include <iostream>
#include <algorithm>
using namespace std;
const int N=55;
int dp[2*N][N][N];
int a[N][N];
int main()
{
int m,n;
cin>>m>>n;
//注意和方格取数不同的点在于是一个矩形不是正方形
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
//i最大为m
for(int k=2;k<=m+n;k++)
for(int i1=1;i1<=m;i1++)
for(int i2=1;i2<=m;i2++)
{//即使好心值为0,也会帮忙
//所以只要注意两个路径不能有重复的点就可以了
//如果有越界值,直接跳过
if(k-i1<=0||k-i1>n||k-i2<=0||k-i2>n)
continue;
int t=a[i1][k-i1]+a[i2][k-i2];
if(i1==i2)
t-=a[i1][k-i1];
int &x=dp[k][i1][i2];
x=max(x,dp[k-1][i1][i2]);
x=max(x,dp[k-1][i1-1][i2]);
x=max(x,dp[k-1][i1-1][i2-1]);
x=max(x,dp[k-1][i1][i2-1]);
x+=t;
}
cout<<dp[m+n][m][m];
}