PKU1088 滑雪
2010-07-13 14:37
316 查看
PKU1088 滑雪
求高度一直下降的最大长度
注:记忆化搜索
本题是简单的DP问题,一开始的时候我用的是深搜的方法,但是发现很容易超时,经过学长提示以及查看Discuss得知用一个数组存入该点的最大长度,搜索时如果Max[ i ][ j ]为非初始化值时就可直接调用。
思路:对每一个点进行搜索,然后用一个数组来保存每个点搜索到得最佳结果,当下一次搜索时如果此数组并非初始值就可直接调用。在搜索的同时,判断当前的最大长度,并赋值给len,最终len的值便是我们想要的结果,这样可以省一个查找最大长度的二重循环
求高度一直下降的最大长度
注:记忆化搜索
#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的值便是我们想要的结果,这样可以省一个查找最大长度的二重循环
相关文章推荐
- pku1088滑雪 记忆搜索
- pku1088----滑雪(记忆性搜索)
- pku_1088_滑雪
- PKU1088——滑雪
- Pku acm 1088 滑雪 动态规划题目解题报告(十五)
- pku 1088 滑雪
- pku1088 滑雪
- 滑雪-PKU ACM 1088
- pku 1088 滑雪
- 再写pku 1088 滑雪 dp
- pku1088:滑雪
- PKU 1088 滑雪
- Pku_1088_滑雪_动态规划
- PKU 1088 滑雪
- pku 1088 滑雪
- PKU-1088-滑雪
- PKU 1088 滑雪
- PKU-1088 滑雪(记忆化搜索)
- pku 1088 滑雪(记忆化搜索)
- PKU_ACM_1088 滑雪