题目:滑雪
思路:dp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <cstdio> using namespace std; #define maxn 110 int vis[maxn][maxn]; int num[maxn][maxn]; int r,c; int move[4][2]={0,1,0,-1,1,0,-1,0}; int dfs(int x,int y) { if(vis[x][y]) return vis[x][y]; int ans=0; for(int i=0;i<4;i++) { int xx=x+move[i][0]; int yy=y+move[i][1]; if(xx>=1&&yy>=1&xx<=r&&yy<=c&&num[x][y]>num[xx][yy]) ans=max(ans,dfs(xx,yy)); } return vis[x][y]=ans+1; } int main() { while(scanf("%d%d",&r,&c)!=EOF) { for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) scanf("%d",&num[i][j]),vis[i][j]=0; int ans=0; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) ans=max(ans,dfs(i,j)); cout<<ans<<endl; } return 0; }