求助#2为何超时

P1434 [SHOI2002] 滑雪

wjk20050306 @ 2021-04-05 20:14:42

#include<bits/stdc++.h>
using namespace std;
int r,c,mp[150][150],len[150][150];
int dx[4]= {0,0,1,-1},dy[4]= {1,-1,0,0};
int cnt=0,q=0,p=0;
bool vis[150][150];
void ch(int x,int y) {
    if(vis[x][y]) {
        len[q][p]=cnt+len[x][y];
        return;
    }
    len[x][y]=1;
    int tmax=-10,a=0,b=0;
    for(int i=0; i<=3; i++) {
        if(x+dx[i]>0&&x+dx[i]<=r&&y+dy[i]>0&&y+dy[i]<=c) {
            a=x+dx[i];
            b=y+dy[i];
            if(mp[a][b]<mp[x][y]) {
                cnt++;
                ch(a,b);
                len[x][y]=max(len[a][b]+1,len[x][y]);
            }
        }
    }
    return;
}
void solve() {
    for(int i=1; i<=r; i++) {
        for(int j=1; j<=c; j++) {
            cnt=0;
            q=i,p=j;
            if(vis[q][p]) continue;
            ch(q,p);
        }
    }
}
int ans=-10;
void find() {
    for(int i=1; i<=r; i++) {
        for(int j=1; j<=c; j++) {
            ans=max(ans,len[i][j]);
        }
    }
}
int main() {
    scanf("%d%d",&r,&c);
    for(int i=1; i<=r; i++) {
        for(int j=1; j<=c; j++) scanf("%d",&mp[i][j]);
    }
    solve();
    find();
    printf("%d",ans);
    return 0;
}

|