求dalao解释为什么需要记忆化以及我的50分WA+TLE

P1434 [SHOI2002] 滑雪

SAOKA_ @ 2019-01-30 10:03:20

我觉得我的代码应该很通俗易懂把。。。

感觉自己没用记忆化呢。。。

记忆化到底该怎么用哦

最后求助我的代码问题

#include <bits/stdc++.h>
using namespace std;
int n,m,maxn=0,sx,sy,ans=0;
int mapn[105][105]={0};
int vis[105][105]={0};
int X[5]={0,1,-1,0,0};
int Y[5]={0,0,0,-1,1};
void check(int k,int p)
{
    if(mapn[k][p]>maxn)
    {
        maxn=mapn[k][p];
        sx=k;
        sy=p;
    }
    return ;
}
int dfs(int x,int y,int k)
{
    for(int i=1;i<=4;++i)
    {
        int nx=x+X[i];
        int ny=y+Y[i];
        if(nx<=0||ny<=0||vis[nx][ny]!=0||mapn[nx][ny]>=mapn[x][y])
            continue;
        else
        {
            vis[nx][ny]=1;
            dfs(nx,ny,k+1);
            vis[nx][ny]=0;
        }
    }
    ans=max(ans,k);
    return 0;
}
int main()
{
    cin>>m>>n;
    for(int i=1;i<=m;++i)
    {
        for(int j=1;j<=n;++j)
        {
            cin>>mapn[i][j];
            check(i,j);
        }
    }
    vis[sx][sy]=1;
    dfs(sx,sy,1);
    cout<<ans;
    return 0;
}

by SAOKA_ @ 2019-01-30 10:04:15

check函数是在输入的时候找最大高度


by 铃宕 @ 2019-01-30 10:13:54

不记忆化跑的太慢,有大量重复的搜索


by Gu_Ren @ 2019-01-30 10:15:40

不一定是从最大高度滑就一定是最长的吧


by 铃宕 @ 2019-01-30 10:16:23

我没加记忆化以前也是TLE加WA,加了以后就A了


by Gu_Ren @ 2019-01-30 10:18:48

每个点应该都搜一遍, 记忆化滑到当前搜到的点的长度,如果下次搜到这个点就直接return(长度)


by SAOKA_ @ 2019-01-30 10:25:32

@木对 对我发现了


by SAOKA_ @ 2019-01-30 10:28:14

谢谢大家


|