RT, 代码:
#include <bits/stdc++.h>
using namespace std;
const long long INF=-1e15;
long long n,m;
long long a[1005][1005];
long long f[1005][1005][3];
long long ans;
long long dfs(int ,int ,int );
int main()
{
scanf("%lld%lld", &n, &m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%lld", &a[i][j]);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
f[i][j][0]=f[i][j][1]=f[i][j][2]=INF;
printf("%lld\n", dfs(n,m,1));
return 0;
}
long long dfs(int x, int y, int to)
{
ans=INF;
if(x==1 && y==1) return a[1][1];
if(x<1 || y<1 || x>n || y>m) return INF;
if(f[x][y][to]>INF) return f[x][y][to];
if(to==0) ans=max(ans, max(dfs(x-1,y,0)+a[x][y],dfs(x,y-1,1)+a[x][y]));
if(to==1) ans=max(ans, max(dfs(x-1,y,0)+a[x][y],max(dfs(x,y-1,1)+a[x][y],dfs(x+1,y,2)+a[x][y])));
if(to==2) ans=max(ans, max(dfs(x+1,y,2)+a[x][y], dfs(x,y-1,1)+a[x][y]));
return f[x][y][to]=ans;
}