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
谢谢大家