这么多人写DP,那我写一个记忆化搜索的,刚开始跑的时候忘记加限制条件,注意有些地方是跑不到的
using namespace std;
#define INF 1000000
int n,m;
int mp[110][110],dp[110][110],mp1[110][110];
int dx[3]={-1,0,1};
int dy[3]={1,1,1};
bool judge(int x,int y){
if(x<1||x>n||y<1||y>m) return false;
else return true;
}
int dfs(int x,int y){
//cout<<x<<" "<<y<<endl;
if(x==n&&y==m){
//cout<<n<<" "<<m<<endl;
return mp[x][y];
}else if(x!=n&&y==m){
return 0;
}
if(dp[x][y]!=0){
return dp[x][y];
}
int ans=mp[x][y];
for(int i=0;i<3;++i){
int xx=x+dx[i];
int yy=y+dy[i];
//cout<<x<<" "<<y<<" "<<ans<<endl;
if(judge(xx,yy)&&(m-yy)>=(n-xx)){//注意限制条件
ans=max(ans,dfs(xx,yy)+mp[x][y]);
}
}
dp[x][y]=ans;
//cout<<x<<" "<<y<<" "<<ans<<endl;
return dp[x][y];
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>mp[i][j];
}
}
memset(dp,0,sizeof(dp));
dfs(1,1);
cout<<dp[1][1]<<endl;
}