
跟方格取数那题类似,唯一的区别是不能经过同一点
但是由于题面保证了每个格子的贡献都是正数,所以只要保证当前两点不同即可,因为从同一点转移过来的会被从不同点转移过来给优化掉
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fr first
#define se second
typedef pair<int, int> PII;
typedef unsigned long long ULL;
const int INF = 0X3f3f3f3f, N = 50 + 10, MOD = 1e9 + 10;
int w[N][N];
int f[2*N][N][N];
void work() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>w[i][j];
for(int k=3;k<=n+m-1;k++){
for(int i1=1;i1<=n;i1++)
for(int i2=1;i2<=n;i2++){
int j1=k-i1,j2=k-i2;
if(i1==i2 || !j1 || !j2 || j1>m || j2>m ) continue;
int &x=f[k][i1][i2],t=w[i1][j1]+w[i2][j2];
// cout<<k<<" "<<i1<<" "<<j1<<" "<<i2<<" "<<j2<<" "<<t<<endl;
x=max(x,f[k-1][i1][i2]+t);
x=max(x,f[k-1][i1-1][i2]+t);
x=max(x,f[k-1][i1][i2-1]+t);
x=max(x,f[k-1][i1-1][i2-1]+t);
}
}
cout<<f[n+m-1][n][n-1];
}
signed main() {
work();
return 0;
}