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;
}

posted @ 2026-02-04 10:19  2025ing  阅读(2)  评论(0)    收藏  举报