P1006 传纸条(DP 状态设计)
设计思路完全同 P1004。
这里选择赋值 \(-\inf\) 的方法排除奇奇怪怪的错解,
控制 \(a\lt c\) 避免重复即可。
#include<bits/stdc++.h>
using namespace std;
const int N=55,inf=1000000;
int n,m,mp[N][N],dp[N][N],pre[N][N];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&mp[i][j]);
for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) dp[i][j]=pre[i][j]=-inf;
pre[1][1]=mp[1][1];
for(int step=3;step<=n+m;step++){
for(int a=max(1,step-m),b;(b=step-a)>0&&a<=n;a++)
for(int c=max(1,step-m),d;(d=step-c)>0&&c<=n;c++)
if(step==n+m||a<c)
dp[a][c]=max(max(pre[a][c],pre[a-1][c]),max(pre[a][c-1],pre[a-1][c-1]))+mp[a][b]+mp[c][d];
for(int a=0;a<=n;a++) for(int c=0;c<=n;c++)
pre[a][c]=dp[a][c],dp[a][c]=-inf;
}
printf("%d\n",pre[n][n]);
return 0;
}

浙公网安备 33010602011771号