传送门
解题思路
把所有的图读进去后,枚举每一个点,求出从这个点出发所能经过的最远距离,因为只能向低处走,所以其实是一张有向无环图,可以进行记忆话搜索。
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,但需要先按照高度排好序,麻烦~。