题解:多进程dp
#include <iostream>
#include <cstdio>
using namespace std;
const int M=55;
int n,m;
short map[M][M];
short f[M][M][M][M];
inline void pd(int &s,int x){
if(s<x) s=x;
}
void init()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&map[i][j]);
}
void work()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int l=1;l<=n;l++)
for(int k=1;k<=m;k++)
{
int s=f[i][j][l][k];
pd(s,f[i-1][j][l-1][k]);
pd(s,f[i-1][j][l][k-1]);
pd(s,f[i][j-1][l-1][k]);
pd(s,f[i][j-1][l][k-1]);
s+=map[i][j];
if(i!=l&&j!=k)
s+=map[l][k];
f[i][j][l][k]=s;
}
printf("%d\n",f[n][m][n][m]);
}
int main()
{
init();
work();
return 0;
}