滑雪题目(来源洛谷)
乍一看,就是深搜+记忆化,结果发现 真的是这样
原始代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,a[105][105],flag[105][105],maxx,t;
int dfs(int x,int y)
{
if(flag[x][y]!=0)
return flag[x][y];
t=0;
if(a[x][y]>a[x][y+1])
t=max(t,dfs(x,y+1));
if(a[x][y]>a[x][y-1])
t=max(t,dfs(x,y-1));
if(a[x][y]>a[x+1][y])
t=max(t,dfs(x+1,y));
if(a[x][y]>a[x-1][y])
t=max(t,dfs(x-1,y));
flag[x][y]=t+1;
return flag[x][y];
}
int main()
{
cin>>n>>m;
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=m+1;j++)
{
a[i][j]=1000000;
flag[i][j]=0;
}
}
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++)
{
dfs(i,j);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
maxx=max(maxx,flag[i][j]);
}
}
cout<<maxx;
return 0;
}
但这样只能90分,每次都是第一个数据WA
在磕了4天以后,终于发现了自己的问题【撒花】
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,a[105][105],flag[105][105],maxx;
int dfs(int x,int y)
{
if(flag[x][y]!=0)
return flag[x][y];
flag[x][y]=1;
if(a[x][y]>a[x][y+1])
flag[x][y]=max(flag[x][y],dfs(x,y+1)+1); //万一刚好相等都是1
if(a[x][y]>a[x][y-1])
flag[x][y]=max(flag[x][y],dfs(x,y-1)+1); //要在判断时就+1
if(a[x][y]>a[x+1][y])
flag[x][y]=max(flag[x][y],dfs(x+1,y)+1);
if(a[x][y]>a[x-1][y])
flag[x][y]=max(flag[x][y],dfs(x-1,y)+1);
return flag[x][y];
}
int main()
{
cin>>n>>m;
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=m+1;j++)
{
a[i][j]=1000000;
flag[i][j]=0;
}
}
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++)
{
dfs(i,j);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
maxx=max(maxx,flag[i][j]);
}
}
cout<<maxx;
return 0;//最重要的一步
}
【撒花~~~】