当前位置:   article > 正文

动态规划——滑雪(洛谷 P1434)_滑雪动态规划

滑雪动态规划

本文讲述动态规划的经典问题——滑雪

采用递推的动态规划方式求解

先用结构体保存每个点对应的原本坐标位置和高度

将所有点按高度从小到大排序;

用一个二维数组保存输入的原本数据

再用一个二维数组保存对应位置的最大滑行距离

从第二个点开始求解(因为第一个点高度最低,显然滑行距离为1)

依次和它在原本坐标里的上下左右四个方向进行判断,

如果它比某一方向上的高度高,则它的滑行距离就应该是相比较的最大滑行距离+1它保存的最大滑行距离中的最大值

最后求完总共的点,进行遍历,得到最终最大值即可!

Description

Michael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 


1 2 3 4 5 
16 17 18 19 6 
15 24 25 20 7 
14 23 22 21 8 
13 12 11 10 9 

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。 

Output

输出最长区域的长度。

Sample Input

 
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

Sample Output

25
 

解题代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct point{
  4. int r,c,h;
  5. }ps[10100];
  6. bool cmp(point a,point b){
  7. return a.h < b.h; //根据高度从小到大排序,依次求解
  8. }
  9. int f[110][110]; //保存输入的数组
  10. int ans[110][110]; //保存求值的结果
  11. int main(){
  12. int n,m; //行列 的数
  13. cin>>n>>m;
  14. //输入数组
  15. for(int i=0;i<n;i++)
  16. for(int j=0;j<m;j++){
  17. cin>>f[i][j];
  18. ps[i * m + j].h = f[i][j];
  19. ps[i * m + j].r = i;
  20. ps[i * m + j].c = j;
  21. ans[i][j] = 1; //初始化完成
  22. }
  23. sort(ps,ps+n*m,cmp);
  24. //开始求解
  25. for(int i = 1;i < n*m;i++){
  26. int r = ps[i].r;
  27. int c = ps[i].c; //得到行列的值
  28. //进行四个方向的判断
  29. if(r > 0 && ps[i].h > f[r-1][c]) //向上
  30. ans[r][c] = max(ans[r][c],ans[r-1][c]+1);
  31. if(c > 0 && ps[i].h > f[r][c-1]) //向左
  32. ans[r][c] = max(ans[r][c],ans[r][c-1]+1);
  33. if(r < n-1 && ps[i].h > f[r+1][c]) //向下
  34. ans[r][c] = max(ans[r][c],ans[r+1][c]+1);
  35. if(c < m-1 && ps[i].h> f[r][c+1]) //向右
  36. ans[r][c] = max(ans[r][c],ans[r][c+1]+1);
  37. }
  38. //输出结果
  39. int maxl = 0;
  40. for(int i=0;i<n;i++)
  41. for(int j=0;j<m;j++)
  42. maxl = max(maxl,ans[i][j]);
  43. cout<<maxl<<endl;
  44. return 0;
  45. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/790382?site
推荐阅读
相关标签
  

闽ICP备14008679号