#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define FOR(i,j,n,k) for(int i=(j);i<=(n);i+=k)
#define ROR(i,j,n,k) for(int i=(j);i>=(n);i-=k)
const int upint=1e6+10;
const double downdouble=1e-6;
int n,m,map[200][200],dp[200][200],way[200][200][20],len;
int max(int x,int y){
return (x>y?x:y);
}
void dfs(int x,int y){
map[x][y]=0;
if(x==0&&y==0) return;
dfs(way[x][y][0],way[x][y][1]);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(),cout.tie();
cin>>n>>m;
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>map[i][j];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==1&&j==1){
dp[i][j]=map[i][j];
continue;
}
else if(i==1){
dp[i][j]=map[i][j]+dp[i][j-1];
way[i][j][0]=1;
way[i][j][1]=j-1;
continue;
}else if(j==1){
dp[i][j]=map[i][j]+dp[i-1][j];
way[i][j][0]=i-1;
way[i][j][1]=j;
continue;
}
way[i][j][0]=way[i][j][1]=0;
dp[i][j]=map[i][j]+max(dp[i][j-1],dp[i-1][j]);
if(dp[i][j-1]>dp[i-1][j]) way[i][j][0]=i,way[i][j][1]=j-1;
else way[i][j][0]=i-1,way[i][j][1]=j;
}
}
len+=dp[n][m];
dfs(n,m);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==1&&j==1){
dp[i][j]=map[i][j];
continue;
}
else if(i==1){
dp[i][j]=map[i][j]+dp[i][j-1];
way[i][j][0]=1;
way[i][j][1]=j-1;
continue;
}else if(j==1){
dp[i][j]=map[i][j]+dp[i-1][j];
way[i][j][0]=i-1;
way[i][j][1]=j;
continue;
}
way[i][j][0]=way[i][j][1]=0;
dp[i][j]=map[i][j]+max(dp[i][j-1],dp[i-1][j]);
if(dp[i][j-1]>dp[i-1][j]) way[i][j][0]=i,way[i][j][1]=j-1;
else way[i][j][0]=i-1,way[i][j][1]=j;
}
}
cout<<len+dp[n][m];
return 0;
}
https://www.luogu.com.cn/record/list?pid=P1006&user=1023793