这道题目,拿到手中,首先想到的是搜索,但是,后来想了想搜索不知道从哪搜起,就看了一下分类,一看属于动态规划类的,因为以前没有接触过动态规划,所以在网上搜了一下动态规划的思想,看过之后也有想到将它们到周围其他的点的距离再保存到一个新的数组中, 但是,这样子写了一下,感觉不行,就在网上搜了一下,确实,方法比这个好多了, 只需要保存一个就行,也就是,之保存当前点能滑的最长距离,最后直接遍历数组,找到这个最大的距离就行了。这样一来,问题就简单多了,最后利用搜索跟动规结合,还是挺容易理解的。

  1. /*************************************************************************
  2. > File Name: 3.cpp
  3. > Author: Howe_Young
  4. > Mail: 1013410795@qq.com
  5. > Created Time: 2015年08月16日 星期日 11时09分27秒
  6. ************************************************************************/
  7.  
  8. #include <cstdio>
  9. #include <iostream>
  10. #include <cstring>
  11. #include <cmath>
  12. #include <cstdlib>
  13. #include <algorithm>
  14. #include <string>
  15. using namespace std;
  16. typedef long long ll;
  17. const int maxn = ;
  18. int mat[maxn][maxn];
  19. int d[maxn][maxn];
  20. int n, m;
  21. const int nx[] = {, -, , }, ny[] = {, , , -};
  22. int dp(int i, int j)
  23. {
  24. if (d[i][j] != )
  25. return d[i][j];
  26. d[i][j] = ;
  27. for (int k = ; k < ; k++)
  28. {
  29. int x = nx[k] + i;
  30. int y = ny[k] + j;
  31. if (x >= && x <= n && y >= && y <= m && mat[i][j] > mat[x][y])
  32. d[i][j] = max(d[i][j], dp(x, y) + );
  33. }
  34. return d[i][j];
  35. }
  36. int main()
  37. {
  38. int T;
  39. cin >> T;
  40. while (T--)
  41. {
  42. char name[];
  43. scanf("%s %d %d", name, &n, &m);
  44. for (int i = ; i <= n; i++)
  45. for (int j = ; j <= m; j++)
  46. scanf("%d", &mat[i][j]);
  47. memset(d, , sizeof(d));
  48. int ans = ;
  49. for (int i = ; i <= n; i++)
  50. for (int j = ; j <= m; j++)
  51. ans = max(ans, dp(i, j));
  52. printf("%s: %d\n", name, ans);
  53. //cout << name << ": " << ans << endl;
  54. }
  55. return ;
  56. }

下面的这个是最优代码,但是我看到有些地方可以改进,这样可以使程序更快,我就稍微改进了一点点,主要就是增加了临时变量来保存那个递归调用的结果,还有就是初始化的时候,用的memset, 这样如果数据量大的话会很快。

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int r, c;
  5. int Map[][], MaxLen[][];//Map用来存放地图,MaxLen用来存放当前点的能滑最大距离
  6. int dir[][] = {{-, }, {, }, {, }, {, -}};
  7. int search_MaxLen(int x, int y)
  8. {
  9. int len = ;
  10. if(x < || y < || x > r || y > c)//判断越界
  11. return ;
  12. if(MaxLen[x][y] != )//如果已经找到,返回
  13. return MaxLen[x][y];
  14. for(int i = ; i < ; i++)
  15. {
  16. if(Map[x][y] > Map[x + dir[i][]][y + dir[i][]])
  17. {
  18. len = search_MaxLen(x + dir[i][], y + dir[i][]);
  19. if(len > MaxLen[x][y])
  20. MaxLen[x][y] = len;
  21. }
  22. }
  23. return ++MaxLen[x][y];
  24. }
  25. int main()
  26. {
  27. int t;
  28. scanf("%d", &t);
  29. while(t--)
  30. {
  31. int len = , max_len = ;
  32. memset(MaxLen, , sizeof(MaxLen));
  33. scanf("%d %d", &r, &c);
  34. for(int i = ; i <= r; i++)
  35. for(int j = ; j <= c; j++)
  36. scanf("%d", &Map[i][j]);
  37. for(int i = ; i <= r; i++)
  38. {
  39. for(int j = ; j <= c; j++)
  40. {
  41. len = search_MaxLen(i, j);
  42. if(len > max_len)
  43. max_len = len;
  44. }
  45. }
  46. printf("%d\n", max_len);
  47. }
  48. return ;
  49. }

NYOJ 10 skiing动态规划心得的更多相关文章

  1. nyoj 10 skiing 搜索+动归

    整整两天了,都打不开网页,是不是我提交的次数太多了? nyoj 10: #include<stdio.h> #include<string.h> ][],b[][]; int ...

  2. NYOJ 10 skiing(好题)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  3. NYOJ 10 skiing (深搜和动归)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪. 由于滑雪的确非常刺激.但是为了获得速度.滑的区域必须向下倾斜.并且 ...

  4. nyoj 10 skiing(记忆化搜索)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  5. nyoj 10——skiing————————【记忆化搜索】

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  6. nyoj 10 skiing (DFS)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  7. nyoj 题目10 skiing —— 南阳oj

    题目信息例如以下: skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区 ...

  8. nyoj 708 ones 动态规划

    http://acm.nyist.net/JudgeOnline/problem.php?pid=708 状态转移方程的思路:对于一个数N,可以是N - 1的状态+1 得到,另外,也可以是(n / 2 ...

  9. nyoj 289 苹果 动态规划 (java)

    分析:0-1背包问题 第一次写了一大串, 时间:576  内存:4152 看了牛的代码后,恍然大悟:看来我现在还正处于鸟的阶段! 第一次代码: #include<stdio.h> #inc ...

随机推荐

  1. nodejs新手教程中upload file的问题

    可参见: http://cnodejs.org/topic/50234890f767cc9a51f88481 request.setEncoding("utf8");应注释掉.

  2. ueditor 1.4.3.2 独立/单独 上传图片框原理

    其实简单的说就是编辑框很多按钮,所有按钮的功能都是以command形式提供,所以execCommand就是执行这些功能的命令.有些按钮是能弹出显示一个对话框,他的基类就是dialog,而所有被弹出的d ...

  3. B题(覆盖问题)

        B - B   Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Desc ...

  4. 常用排序算法之——快速排序(C语言+VC6.0平台)

    经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) / ...

  5. mongod的主要参数有

    ------------------------------------基本配置----------------------   --quiet # 安静输出 --port arg # 指定服务端口号 ...

  6. ubuntu 的远程桌面

    好久没有弄ubuntu 丢人的啊,先安装了个服务器版,发现好多命令都忘记了,命令行下根本搞不懂 又安装了个桌面版...但是服务器远程么,putty还是搞的头大,又乱码,有各种文件传输. 还好记得以前用 ...

  7. Tomcat 9.0安装配置

    本文转自:http://blog.sina.com.cn/s/blog_15126e2170102w5o8.html 一.JDK的安装与配置 1.从官网下载jdk,注意是jdk不是jre.最好从官网下 ...

  8. mybatis框架搭建学习初步

    mybatis框架搭建步骤:1. 拷贝jar到lib目录下,而且添加到工程中2. 创建mybatis-config.xml文件,配置数据库连接信息 <environments default=& ...

  9. [转载]mininet的安装和使用

    http://blog.csdn.net/neterpaole/article/details/8512106 最近在搞controller+mininet的openflow环境模拟,搞得不是很顺利, ...

  10. h.264加权预测

    帧间运动是基于视频亮度(luma)不发生改变的一个假设,而在视频序列中经常能遇到亮度变化的场景,比如淡入淡出.镜头光圈调整.整体或局部光源改变等,在这些场景中,简单帧间运动补偿的效果可想而知(实际编码 ...