P1434 [SHOI2002]滑雪(dfs+dp)
https://www.luogu.com.cn/problem/P1434
在一个二维数组里面,找到一个依次递减的路线,求最大的那条长度
#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<queue> #include<map> #include<string.h> using namespace std; typedef long long int ll; int n,k,m,b,t,t1,t2,t3,maxx=0; const int maxn=1e2+5; const int mod= 80112002; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; vector<vector<int> >v(maxn,vector<int>(maxn)); vector<vector<int> >tot(maxn,vector<int>(maxn)); vector<int>a(maxn); int dp[maxn]; int dfs(int x,int y) { if(tot[x][y])return tot[x][y]; tot[x][y]=1; for(int i=0;i<4;i++){ int tx=x+dx[i]; int ty=y+dy[i]; if(tx<0||tx>=n||ty<0||ty>=m)continue; if(v[tx][ty]<v[x][y]){ dfs(tx,ty); tot[x][y]=max(tot[x][y],tot[tx][ty]+1); } } return tot[x][y]; } int main() { scanf("%d%d",&n,&m); for(int i=0;i<maxn;i++)v[i].clear(),tot[i].clear();a.clear(); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>v[i][j]; } } int ans=-1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ ans=max(ans,dfs(i,j)); } } cout<<ans<<endl; return 0; }