//dp[k,x1,x2]表示总共走了k步,第一条路线在x1行,第二条路线在x2行 max
//dp[k,x1,x2]--->
//dp[k-1,x,y],dp[k-1,x-1,y],dp[k-1,x,y-1],dp[k-1,x-1,y-1]
//1<=x1<=n;------>x1>=1 , x1<=n
//1<=k-x1<=m ---> x1>=k-m , x1<=k-1
const int N=55;
int c[N][N],dp[N<<1][N][N];
signed main()
{
int n,m;cin>>n>>m;
rpp(i,n) rpp(j,m) cin>>c[i][j];
for(int k=2;k<=n+m;++k)
for(int i=max(1,k-m);i<=min(n,k-1);++i)
for(int j=max(1,k-m);j<=min(n,k-1);++j)
{
int t=c[i][k-i];if(i!=j) t+=c[j][k-j];
rep(a,2) rep(b,2) dp[k][i][j]=max(dp[k][i][j],dp[k-1][i-a][j-b]+t);
}
cout<<dp[n+m][n][n]<<endl;//抱头痛哭,这里一定不要顺手写dp[n+m][n][m]
return 0;
}
AcWing 275. 传纸条 (线性DP)
最新推荐文章于 2024-05-12 14:32:29 发布