递推型DP

将每个滑雪点都看作起点,从最低点开始逐个由四周递推出到达此点的最长路径的长度,由该点记下。

理论上,也可以将每一点都看作终点,由最高点开始计数,有兴趣可以试试。

  1. //经典DP-由高向低海拔滑雪-求最长路
  2. //Memory:372K Time:16 Ms
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. #define MAX 105
  10.  
  11. int row, col, len;
  12. int map[MAX][MAX]; //标准记录
  13. int mov[][] = { { , },{ -, },{ , },{ , - } };
  14. int d[MAX][MAX]; //dp[]
  15. int ans;
  16.  
  17. /*各点属性*/
  18. struct Node {
  19. int x, y; //坐标(x,y)
  20. int value; //海拔
  21. }node[MAX*MAX];
  22.  
  23. bool operator < (const Node a, const Node b)
  24. {
  25. return a.value < b.value;
  26. }
  27.  
  28. void DP()
  29. {
  30. ans = ;
  31. memset(d, , sizeof(d));
  32. for (int i = ; i < len; i++)
  33. {
  34. int x = node[i].x, y = node[i].y;
  35. for (int j = ; j < ; j++)
  36. {
  37. int tx = x + mov[j][];
  38. int ty = y + mov[j][];
  39. if (tx >= && tx < row && ty >= && ty < col)
  40. {
  41. if (map[x][y] > map[tx][ty])
  42. d[x][y] = max(d[x][y], d[tx][ty] + );
  43. }
  44. d[x][y] = max(, d[x][y]);
  45. }
  46. ans = max(ans, d[x][y]);
  47. }
  48. return;
  49. }
  50.  
  51. int main()
  52. {
  53. scanf("%d%d", &row, &col);
  54. len = ;
  55. for (int i = ; i < row; i++)
  56. {
  57. for (int j = ; j < col; j++)
  58. {
  59. scanf("%d", &map[i][j]);
  60. node[len].x = i;
  61. node[len].y = j;
  62. node[len++].value = map[i][j];
  63. }
  64. }
  65. sort(node, node + len); //将各点按照-升序-排列
  66. DP();
  67. printf("%d\n", ans);
  68. return ;
  69. }

记忆化搜索型DP

  不必排序,解法和思路也相对更加清晰

  

  1. //经典DP-由高向低海拔滑雪-求最长路
  2. //Memory:252K Time:16 Ms
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. using namespace std;
  7.  
  8. #define max(x,y) ((x)>(y)?(x):(y))
  9. #define MAX 105
  10.  
  11. int row, col;
  12. int map[MAX][MAX]; //标准记录
  13. int mov[][] = { { , },{ -, },{ , },{ , - } };
  14. int d[MAX][MAX]; //distance
  15. int ans;
  16.  
  17. int DFS(int x, int y)
  18. {
  19. if (d[x][y]) return d[x][y];
  20.  
  21. for (int i = ; i < ; i++)
  22. {
  23. int tx = x + mov[i][];
  24. int ty = y + mov[i][];
  25. if (tx >= && tx < row && ty >= && ty < col)
  26. if (map[tx][ty] < map[x][y]) //向下滑雪
  27. d[x][y] = max(DFS(tx, ty) + , d[x][y]);
  28. }
  29.  
  30. ans = max(d[x][y], ans);
  31. return d[x][y];
  32. }
  33.  
  34. int main()
  35. {
  36. scanf("%d%d", &row, &col);
  37.  
  38. for (int i = ; i < row; i++)
  39. for (int j = ; j < col; j++)
  40. scanf("%d", &map[i][j]);
  41.  
  42. memset(d, , sizeof(d));
  43. for (int i = ; i < row; i++)
  44. for (int j = ; j < col;j++)
  45. DFS(i,j);
  46.  
  47. printf("%d\n", ans + );
  48. return ;
  49. }

ACM/ICPC 之 简单DP-记忆化搜索与递推(POJ1088-滑雪)的更多相关文章

  1. 由DAG到背包问题——记忆化搜索和递推两种解法

    一.问题描述 物品无限的背包问题:有n种物品,每种均有无穷多个.第 i 种物品的体积为Vi,重量为Wi.选一些物品装到一个容量为 C 的背包中,求使得背包内物品总体积不超过C的前提下重量的最大值.1≤ ...

  2. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...

  3. POJ 1088 DP=记忆化搜索

    话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...

  4. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  5. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  6. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  7. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  8. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

  9. ACM学习历程—POJ1088 滑雪(dp && 记忆化搜索)

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

随机推荐

  1. 【8-20】java学习笔记02

    others 初始化块在构造器前执行: 静态初始化块和实例变量显示初始化执行顺序为各自定义的位置: final类不能派生子类,final方法不可覆盖,final变量不可重新赋值: 判定值相等,Stri ...

  2. PHP中spl_autoload_register()函数

    spl_autoload_register — 注册给定的函数作为 __autoload 的实现 官方地址:http://php.net/manual/zh/function.spl-autoload ...

  3. Memcached 简介、安装和基本使用

    本章包括内容: 一.Memcached是什么.能干什么.特点; 二.在Centos7上安装Memcached 三.Memcached启动.简单操作.关闭------------------------ ...

  4. jQuery源码-class操作

    写在前面 本文写作基于jQuery 1.9.1版本,源码分析系列目录:http://www.cnblogs.com/chyingp/archive/2013/06/03/jquery-souce-co ...

  5. 网站为什么要做SEO

    网站为什么要做seo,不做seo可以吗?因为seo是获得流量比较稳定.长久的方式,也是自身品牌的最好的方式.我们做的网站必须有用户访问或者被用户知道才有价值和意义,而想被用户所了解的话,必须做网络营销 ...

  6. sql server cpu占用过高优化

    SQLSERVER排查CPU占用高的情况 今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高 ...

  7. 【AngularJS】—— 10 指令的复用

    前面练习了如何自定义指令,这里练习一下指令在不同的控制器中如何复用. —— 来自<慕课网 指令3> 首先看一下一个小例子,通过自定义指令,捕获鼠标事件,并触发控制器中的方法. 单个控制器的 ...

  8. AngularJS 国际化——Angular-translate

    对于一个用户群面向全球的的应用来说,不得不考虑国际化的问题.当然,即便是刚刚起步的小应用,如果有心搞大,也应该提前设计国际化的方案. 本篇讲述使用AngularJS构建的应用的简单国际化方案,准确的说 ...

  9. HDOJ 3853 LOOPS

    水概率DP.... LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others ...

  10. 编译CDH Spark源代码

    如何编译CDH Spark源代码 经过漫长的编译过程(我编译了2个半小时),最终成功了,在assembly/target/scala-2.10目录下面有spark-assembly-1.0.0-cdh ...