刚才写过了dfs的方法
现在回顾一下dp算法
dp的算法看起来比dfs 好理解的多 当然dfs设计复杂的递归本来就不是一种好理解的算法。
我们首先用struct data 存储节点
这个节点是由坐标和 height值组成的。
data arr【maxn】;
具体步骤就是输入 赋值arr数组
然后从小到大排序
我们的思想是从height最小的那个点开始
探查它的上下左右四个点 一旦发现比它大的 并且dp值可以更新的就更新
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=10005; struct Data{ int x,y,h;}; Data arr[maxn]; int height[105][105]; int dp[105][105]; bool Cmp(const Data & a,const Data & b) { return a.h<b.h; } int i,j,k,c,r; int main() { scanf("%d%d",&c,&r); int index=0; for(i=1;i<=c;++i) { for(j=1;j<=r;++j) { arr[index].x=i; arr[index].y=j; scanf("%d",&arr[index].h); height[i][j]=arr[index].h; dp[i][j]=1; index++; } } sort(arr,arr+c*r,Cmp); for(i=0;i<c*r;++i) { if(height[arr[i].x+1][arr[i].y]>arr[i].h) { if(dp[arr[i].x+1][arr[i].y]<dp[arr[i].x][arr[i].y]+1) dp[arr[i].x+1][arr[i].y]=dp[arr[i].x][arr[i].y]+1; } if(height[arr[i].x-1][arr[i].y]>arr[i].h) { if(dp[arr[i].x-1][arr[i].y]<dp[arr[i].x][arr[i].y]+1) dp[arr[i].x-1][arr[i].y]=dp[arr[i].x][arr[i].y]+1; } if(height[arr[i].x][arr[i].y+1]>arr[i].h) { if(dp[arr[i].x][arr[i].y+1]<dp[arr[i].x][arr[i].y]+1) dp[arr[i].x][arr[i].y+1]=dp[arr[i].x][arr[i].y]+1; } if(height[arr[i].x][arr[i].y-1]>arr[i].h) { if(dp[arr[i].x][arr[i].y-1]<dp[arr[i].x][arr[i].y]+1) dp[arr[i].x][arr[i].y-1]=dp[arr[i].x][arr[i].y]+1; } } int max=1; for(i=1;i<=c;++i) { for(j=1;j<=r;++j) { if(dp[i][j]>max) max=dp[i][j]; } } printf("%d\n",max); return 0; }