50求调

P1434 [SHOI2002] 滑雪

PYCMONSTER @ 2024-10-21 14:04:01

#include<bits/stdc++.h>//P1434
using namespace std;

int n,m,a[1001][1001],cnt[1001][1001];
int X[5]={1,0,-1,0},Y[5]={0,1,0,-1};

int dfs(int x,int y){

    if(x>n||y>m||x<1||y<1)return 0;
    int ans=1,ma=-10;
    for(int i=0;i<=3;i++)
    {
        int xx=x+X[i],yy=y+Y[i]; 
        if(a[xx][yy]<a[x][y])
        if(cnt[xx][yy]!=0)ma=max(ma,cnt[xx][yy]);
        else ma=max(ma,dfs(xx,yy));
    }
    return ans+ma; 
}

int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int mx=-10;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j]; 
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cnt[i][j]=dfs(i,j),mx=max(mx,cnt[i][j]);
    cout<<mx;
    return 0;
} 

by jyc0322 @ 2024-10-22 16:02:42

建议重新学一下记忆化,你这个写法...,抱歉,我太菜了,看不懂,感觉有问题,有个点你都没有答案。

然后注意代码不要这么写:

if(a[xx][yy]<a[x][y])
if(cnt[xx][yy]!=0)ma=max(ma,cnt[xx][yy]);
else ma=max(ma,dfs(xx,yy));

改为

if(a[xx][yy]<a[x][y]){
    if(cnt[xx][yy]!=0)ma=max(ma,cnt[xx][yy]);
    else ma=max(ma,dfs(xx,yy));
}

|