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 哦哦好的,谢谢您