寄忆化求调 玄关

P1434 [SHOI2002] 滑雪

czy032321054 @ 2024-08-02 16:04:48

#include<bits/stdc++.h>
using namespace std;
int r,c,a[110][110],dx[4]={1,-1,0,0},dy[4]={0,0,1,-1},f[110][110];
int dfs(int x,int y){
    if(f[x][y]!=-1)return f[x][y];
    f[x][y]=0;
    int ans=-2e9;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            for(int k=0;k<4;k++)
                if(a[i+dx[k]][j+dy[k]]>a[i][j]&&i+dx[k]>=1&&i+dx[k]<=r&&j+dy[k]>=1&&j+dy[k]<=c)
                    ans=max(ans,dfs(i+dx[k],j+dy[k]));
    if(ans==-2e9)ans=-1;
    ans++;
    return f[x][y]=ans;
}
int main(){
    cin>>r>>c;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            cin>>a[i][j],f[i][j]=-1;
    for(int i=1;i<=r;i++){
        for(int j=1;j<=c;j++){
            bool b=0;
            for(int k=0;k<4;k++)
                if(a[i+dx[k]][j+dy[k]]<a[i][j]&&i+dx[k]>=1&&i+dx[k]<=r&&j+dy[k]>=1&&j+dy[k]<=c){
                    b=1;
                    break;
                }
            if(b)continue;
            f[i][j]=dfs(i,j);
        }
    }
    int ans=-2e9;
    for(int i=1;i<=r;i++) 
        for(int j=1;j<=c;j++)
            ans=max(ans,f[i][j]);
    cout<<ans;
}

|