蒟蒻求助!70分,dp的方法(三十行代码,有注释

P1434 [SHOI2002] 滑雪

xixi_bang @ 2020-04-12 20:42:10

#include<bits/stdc++.h>
using namespace std;
long long maze[105][105];//表示滑雪点高度
long long dp[105][105];
int main(){
    int R,C;
    cin>>R>>C;
    for(int i=1;i<=R;i++)
    for(int j=1;j<=C;j++){
        cin>>maze[i][j];
    }
    for(int i=1;i<=R;i++)
    for(int j=1;j<=C;j++){//dp[i][j]表示在(i,j)位置时能够得到的最大滑雪高度
        int a=0,b=0,c=0,d=0;
        int h=maze[i][j];

        if(i+1<=R&&maze[i+1][j]<maze[i][j]) a=1;
        if(j+1<=C&&maze[i][j+1]<maze[i][j]) b=1;
        if(i-1>=1&&maze[i-1][j]<maze[i][j]) c=1;
        if(j-1>=1&&maze[i][j-1]<maze[i][j]) d=1;
        //利用a,b,c,d判断max值是否有效
        dp[i][j]=max(a*(dp[i+1][j]+h-maze[i+1][j]),max(b*(dp[i][j+1]+h-maze[i][j+1]),
                max(c*(dp[i-1][j]+h-maze[i-1][j]),d*(dp[i][j-1]+h-maze[i][j-1]))));
    }
    long long ans=0;
    for(int i=1;i<=R;i++)
    for(int j=1;j<=C;j++){
        ans=max(dp[i][j],ans);
    }

    cout<<ans+1<<endl;//高度最后需要+1
}

by xixi_bang @ 2020-04-13 22:33:32

@metaphysis 谢谢您,我明白了。我还有一个问题:dp要怎么发现自己的转移方程有问题呢?print什么进行查错呢?


by metaphysis @ 2020-04-14 06:32:04

@xixi_bang

可以构造简单的,数据量较小的,可以手工验证的边界测试数据进行验证。


by xixi_bang @ 2020-04-14 11:06:40

@metaphysis 哦哦好的,谢谢您


上一页 |