洛谷 P1434 [SHOI2002]滑雪(记忆化搜索)

传送门


解题思路

把所有的图读进去后,枚举每一个点,求出从这个点出发所能经过的最远距离,因为只能向低处走,所以其实是一张有向无环图,可以进行记忆话搜索。

AC代码

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int r,c,m[105][105],dp[105][105],ans;
 5 int dfs(int x,int y){
 6     if(dp[x][y]) return dp[x][y];
 7     if(x>1&&m[x-1][y]<m[x][y]) dp[x][y]=max(dfs(x-1,y)+1,dp[x][y]); 
 8     if(x<r&&m[x+1][y]<m[x][y]) dp[x][y]=max(dfs(x+1,y)+1,dp[x][y]); 
 9     if(y>1&&m[x][y-1]<m[x][y]) dp[x][y]=max(dfs(x,y-1)+1,dp[x][y]); 
10     if(y<c&&m[x][y+1]<m[x][y]) dp[x][y]=max(dfs(x,y+1)+1,dp[x][y]); 
11     return dp[x][y];
12 }
13 int main(){
14     cin>>r>>c;
15     for(int i=1;i<=r;i++){
16         for(int j=1;j<=c;j++){
17             scanf("%d",&m[i][j]);
18         }
19     }
20     for(int i=1;i<=r;i++){
21         for(int j=1;j<=c;j++){
22             ans=max(ans,dfs(i,j));
23         }
24     }
25     cout<<ans+1;
26     return 0;
27 }

当然,可以转为dp,但需要先按照高度排好序,麻烦~。

猜你喜欢

转载自www.cnblogs.com/yinyuqin/p/12203051.html