poj1088(动态规划经典)
2012-03-29 22:15
134 查看
题目链接:http://poj.org/problem?id=1088
题目意思:滑雪问题,给一个二维数组,要求从中找出一点,从改点出发,可以向前、后、左、右四个方向滑动,但要求高度只能越来越低,求出这样一条路径最长的下降序列,输出经过的点的个数(max)。
以下转自某以为大牛:
算法:开一个二维数组high记录每个点的高度,一个二维数组len记录每个点能搜索到的最长下降子序列的长度(初始值全为零),一个结构体数组note line[20000]记录每个点的坐标(x,y)和高度值 h.
先将每个点的记录信息保存在结构体数组中。然后以高度由低到高的顺序排序,初始状态下指针就位于结构体数组的起始位置。
接着顺序的扫描此结构体数组内的信息,因为已经排好序,所以高度是一次递增的,这样做的好处是只需要朝着一个方向搜索,而且还可以有效避免越界的问题。
当指针每指向一个结构体个体时,我们均可以找到该点在high数组里的位置,如果存在任意一个点,在它周围的四个方向上而且高度比该点大且这个任意点的最长下降子序列小于或等于该店的长度。那么这个任意点的最长下降子序列的长度就+1;
等到结构体数组扫描完成,再去遍历len这个二维数组,求出最大值即为所求;
代码:
题目意思:滑雪问题,给一个二维数组,要求从中找出一点,从改点出发,可以向前、后、左、右四个方向滑动,但要求高度只能越来越低,求出这样一条路径最长的下降序列,输出经过的点的个数(max)。
以下转自某以为大牛:
算法:开一个二维数组high记录每个点的高度,一个二维数组len记录每个点能搜索到的最长下降子序列的长度(初始值全为零),一个结构体数组note line[20000]记录每个点的坐标(x,y)和高度值 h.
先将每个点的记录信息保存在结构体数组中。然后以高度由低到高的顺序排序,初始状态下指针就位于结构体数组的起始位置。
接着顺序的扫描此结构体数组内的信息,因为已经排好序,所以高度是一次递增的,这样做的好处是只需要朝着一个方向搜索,而且还可以有效避免越界的问题。
当指针每指向一个结构体个体时,我们均可以找到该点在high数组里的位置,如果存在任意一个点,在它周围的四个方向上而且高度比该点大且这个任意点的最长下降子序列小于或等于该店的长度。那么这个任意点的最长下降子序列的长度就+1;
等到结构体数组扫描完成,再去遍历len这个二维数组,求出最大值即为所求;
代码:
#include<stdio.h> #include<stdlib.h> typedef struct { int x; int y; int h; }note; note line[20000]; int high[120][120]; int len[120][120]; int cmp(const void *e1,const void *e2) { if((*(note*)e1).h > (*(note*)e2).h) return 1; else return -1; } void main() { int i,j,k=-1,m,n,max=0; scanf("%d%d",&m,&n); for(i=1;i<=m;i++) for(j=1;j<=n;j++) { k++; scanf("%d",&high[i][j]); line[k].x=i; line[k].y=j; line[k].h=high[i][j]; } qsort(line,m*n,sizeof(line[0]),cmp); for(i=0;i<m*n;i++) { if(high[line[i].x][line[i].y]<high[line[i].x+1][line[i].y]&&len[line[i].x][line[i].y]>=len[line[i].x+1][line[i].y]) len[line[i].x+1][line[i].y]=len[line[i].x][line[i].y]+1; if(high[line[i].x][line[i].y]<high[line[i].x-1][line[i].y]&&len[line[i].x][line[i].y]>=len[line[i].x-1][line[i].y]) len[line[i].x-1][line[i].y]=len[line[i].x][line[i].y]+1; if(high[line[i].x][line[i].y]<high[line[i].x][line[i].y+1]&&len[line[i].x][line[i].y]>=len[line[i].x][line[i].y+1]) len[line[i].x][line[i].y+1]=len[line[i].x][line[i].y]+1; if(high[line[i].x][line[i].y]<high[line[i].x][line[i].y-1]&&len[line[i].x][line[i].y]>=len[line[i].x][line[i].y-1]) len[line[i].x][line[i].y-1]=len[line[i].x][line[i].y]+1; } for(i=1;i<=m;i++) for(j=1;j<=n;j++) { if(max<=len[i][j]) max=len[i][j]; } printf("%d\n",max+1); }
相关文章推荐
- 动态规划入门(二)DP 基本思想 具体实现 经典题目 POJ1088 POJ1163 POJ1050
- 动态规划经典问题Java实现
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
- 【算法竞赛入门经典】类似于最优矩阵链乘的动态规划 例题9-9 UVa10003
- 【算法竞赛入门经典】递归结构的动态规划 例题9-10 UVa1626
- ZJU2014 Piggy-Bank - 经典动态规划
- 经典动态规划基础题-三角形最大和问题
- ZSTUOJ 4214: Power Eggs(经典动态规划——鹰蛋问题)
- Edit Distance——经典的动态规划问题
- 动态规划经典问题03:数组中最大的数对差(或最小的数对差)
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
- NYoj 16 矩形嵌套[经典动态规划1]
- 动态规划经典——石子归并
- 动态规划经典——石子归并
- pku1458-----Common Subsequence(经典动态规划题)
- 算法竞赛入门经典 DAG上的动态规划
- nyist oj 214 单调递增子序列(二) (动态规划经典)
- 动态规划入门(四)DP 基本思想 具体实现 经典题目 POJ1160 POJ1037
- leetcode-3 Longest Substring Without Repeating Characters经典的动态规划问题
- POJ 1159 Palindrome(动态规划经典问题)