您的位置:首页 > 其它

PKU1088 滑雪

2010-07-13 14:37 316 查看
PKU1088 滑雪
求高度一直下降的最大长度
注:记忆化搜索

#include<stdio.h>
#include<string.h>
int dif[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int c,r,len;
int Max[101][101],a[101][101];

int find(int i,int j)
{
int ii,jj,k,max=0;
if(Max[i][j]) return Max[i][j];//如果已经得到了以该点为起点的最大长度,直接return
for(k=0;k<4;k++)//四个方向查找
{
ii=i+dif[k][0];
jj=j+dif[k][1];
if(ii>=r||ii<0||jj>=c||jj<0) continue;
if(a[ii][jj]<a[i][j]&&max<find(ii,jj))
max=find(ii,jj);
}
if(len<max+1) len=max+1;//在计算以此点开始的最大长度的同时,找出此时的最大长度
return Max[i][j]=max+1;
}

int main()
{
int i,j;
while(scanf("%d%d",&r,&c)!=EOF)
{
len=0;
memset(Max,0,sizeof(Max));//Max必须初始化
for(i=0;i<r;i++)
for(j=0;j<c;j++)
scanf("%d",&a[i][j]);
for(i=0;i<r;i++)
for(j=0;j<c;j++)
find(i,j);
printf("%d/n",len);
}
return 0;
}


本题是简单的DP问题,一开始的时候我用的是深搜的方法,但是发现很容易超时,经过学长提示以及查看Discuss得知用一个数组存入该点的最大长度,搜索时如果Max[ i ][ j ]为非初始化值时就可直接调用。

思路:对每一个点进行搜索,然后用一个数组来保存每个点搜索到得最佳结果,当下一次搜索时如果此数组并非初始值就可直接调用。在搜索的同时,判断当前的最大长度,并赋值给len,最终len的值便是我们想要的结果,这样可以省一个查找最大长度的二重循环
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: