题目大意:给一个二维矩阵,里面的数代表高度。现在你要滑雪,并且要滑一条最长的道,你可以从任何一个点开始,滑的时候只能从高地往低地滑,现求最长长度。
考察点:记忆化搜索
思路分析:其实这题做法很多。。可以记忆化搜索,也可以快排+DP。记忆化搜索就是搜到某个点的时候把这个点的状态记录下来,这样当第二次搜到这个点的时候可以大量的剪枝。。
#include<stdio.h>
#define max(x,y) (x)>(y)? (x):(y)
int a[101][101];
int f[101][101];
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m;
int dfs(int x,int y)
{
if (f[x][y]!=0) return f[x][y];
int maxx=0,s,i;
for (i=0;i<4;i++)
{
int c=x+d[i][0];int b=y+d[i][1];
if ((c<=n)&&(b<=m)&&(c>0)&&(b>0)&&(a[c][b]<a[x][y]))
{
s=dfs(c,b);
maxx=max(maxx,s);
}
}
f[x][y]=max(f[x][y],maxx+1);
return f[x][y];
}
int main()
{
int i,j,ans;
while (scanf("%d%d",&n,&m)!=EOF)
{
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
scanf("%d",&a[i][j]);
ans=-1;
memset(f,0,sizeof(f));
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
f[i][j]=dfs(i,j);
ans=max(ans,f[i][j]);
}
printf("%d\n",ans);
}
return 0;
}
433

被折叠的 条评论
为什么被折叠?



