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;
}

 

posted @ 2020-05-16 13:43  mohari  阅读(139)  评论(0编辑  收藏  举报