首先看一下题目:

Introduction

Dynamic programming is a confusing name for a programming technique that dramatically reduces the runtime of algorithms: from exponential to polynomial. The basic idea is to try to avoid solving the same problem or subproblem twice. Here is a problem to demonstrate its power:

Given a sequence of as many as 10,000 integers (0 < integer < 100,000), what is the maximum decreasing subsequence? Note that the subsequence does not have to be consecutive.

原题说,有10000个整数,求其中最长递减子序列的长度,其中子序列是可以不连续的。例如,给定序列100, 5, 99, 98,其中最长递减子序列就是100,99,98。从这个例子可以看出,我们很有可能需要舍掉一些小到过分的元素,来保证后面的数字可以大一些,使得更后面的数字有下降的空间。

为了测试的方便,我们将这里的10000个整数暂时换成别的数目的整数。

以下是官方给出的最朴素的解法,我在上做了一些微小的修改。这种做法的实质就是把所有的递减序列找出来,然后找出长度最长的。

  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5. const int maxn = ;
  6. int n;
  7. int sequence[maxn];
  8.  
  9. int check(int start, int nmatches, int smallest);
  10.  
  11. int main() {
  12. freopen("test.in", "r", stdin);
  13. cin >> n;
  14. for(int i = ; i < n; i++) {
  15. cin >> sequence[i];
  16. }
  17. cout << check(, , );
  18. return ;
  19. }
  20.  
  21. int check(int start, int nmatches, int smallest) {
  22. cout << "Check!" << endl;
  23. cout << start << " " << nmatches << " " << smallest << endl;
  24. int better;
  25. int best = nmatches;
  26. for(int i = start; i < n; i++) {
  27. if(sequence[i] < smallest) {
  28. better = check(i, nmatches + , sequence[i]);
  29. if(better > best) {
  30. best = better;
  31. }
  32. }
  33. }
  34. return best;
  35. }

其中,text.in的数据是我随机生成的,如下:

这里的check函数是使用了递归的,递归的终止条件是for循环运行结束,递归的状态转移是在添加了新的数字到递减序列后能达到的最大长度。

如果对于算法一下不能看懂的话,那么可以对照着运行结果看。

运行结果如下:

  1. Check!
  2.  
  3. Check!
  4.  
  5. Check!
  6.  
  7. Check!
  8.  
  9. Check!
  10.  
  11. Check!
  12.  
  13. Check!
  14.  
  15. Check!
  16.  
  17. Check!
  18.  
  19. Check!
  20.  
  21. Check!
  22.  
  23. Check!
  24.  
  25. Check!
  26.  
  27. Check!
  28.  
  29. Check!
  30.  
  31. Check!
  32.  
  33. Check!
  34.  
  35. Check!
  36.  
  37. Check!
  38.  
  39. Check!
  40.  
  41. Check!
  42.  
  43. Check!
  44.  
  45. Check!
  46.  
  47. Check!
  48.  
  49. Check!
  50.  
  51. Check!
  52.  
  53. Check!
  54.  
  55. Check!
  56.  
  57. Check!
  58.  
  59. Check!
  60.  
  61. Check!
  62.  
  63. Check!
  64.  
  65. Check!
  66.  
  67. Check!
  68.  
  69. Check!
  70.  
  71. Check!
  72.  
  73. Check!
  74.  
  75. Check!
  76.  
  77. Check!
  78.  
  79. Check!
  80.  
  81. Check!
  82.  
  83. Check!
  84.  
  85. Check!
  86.  
  87. Check!
  88.  
  89. Check!
  90.  
  91. Check!
  92.  
  93. Check!
  94.  
  95. Check!

这里是说,对于递减子序列,我们需要把每一个在原序列中的可能成为当前子序列的末尾元素的元素进行测试。就比如最小子序列的第0号元素,因为任何一个元素都可以成为一个长度为1的递减子序列的,所以最小子序列的第0号元素可能是64,65,97,43,5,36,92,72,87,44中的任何一个。但是假设我们已经选定了第0号元素是64,那么第1号元素就有可能是43,5,36,44中的任意一个。

  1. 64 65 97 43 5 36 92 72 87 44

USACO Dynamic Programming (1)的更多相关文章

  1. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  2. Dynamic Programming

    We began our study of algorithmic techniques with greedy algorithms, which in some sense form the mo ...

  3. HDU 4223 Dynamic Programming?(最小连续子序列和的绝对值O(NlogN))

    传送门 Description Dynamic Programming, short for DP, is the favorite of iSea. It is a method for solvi ...

  4. hdu 4223 Dynamic Programming?

    Dynamic Programming? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  5. 算法导论学习-Dynamic Programming

    转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...

  6. Dynamic Programming: From novice to advanced

    作者:Dumitru 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg An impo ...

  7. HDU-4972 A simple dynamic programming problem

    http://acm.hdu.edu.cn/showproblem.php?pid=4972 ++和+1还是有区别的,不可大意. A simple dynamic programming proble ...

  8. [算法]动态规划(Dynamic programming)

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4603173.html Dynamic Programming的Programming指的不是程序而是一种表格 ...

  9. hdu 4972 A simple dynamic programming problem(高效)

    pid=4972" target="_blank" style="">题目链接:hdu 4972 A simple dynamic progra ...

随机推荐

  1. java内存模型7-处理器内存模型

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JMM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...

  2. @PathVariable和@RequestParam的区别,@SessionAttributes

    简介: handler method参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类: A:处理requet uri部分(这里指uri template中variable,不 ...

  3. STM32采集电阻触摸贴膜

    今天为了解决一个测量电阻屏压力的问题,自己直接用STM32做了一个测量电阻屏的程序(直接把触摸屏的四根线接到单片机引脚上),通过AD切换采集,采集X轴电压,Y轴电压,和压力..最后附上自己的程序 先说 ...

  4. MyBatis之级联——鉴别器

    鉴别器(discriminator)是MyBatis为我们提供的第三个级联也是最后一个.基于之前两篇级联中的场景,现增加学生们去体检,但男女体检项目不一样,我们把男女体检表做成两张表,当然我想也可以设 ...

  5. python 爬取淘宝的模特照片

    前段时间花了一部分时间学习下正则表达式,总觉得利用正则要做点什么事情,所以想通过爬取页面的方式把一些美女的照片保存下来,其实过程很简单. 1.首先读取页面信息: 2.过滤出来照片的url地址: 3.通 ...

  6. 【图解HTTP】笔记摘要

    第1章 了解Web及网络基础 根据Web浏览器(Web客户端)地址栏中指定的URL,Web浏览器从Web服务器端获取文件资源(resource)等信息,从而显示出Web页面. CERN(欧洲核子研究组 ...

  7. kotlin语言使用初体验(一)

    居说谷歌新认的干儿子kotlin极为受宠,隐隐有替代Java在 android平台老大位置的趋势.kotlin有谷歌撑腰,加上自己的底子也厚,再之与Java无缝兼容,将来在流行的编程语言中占有一席之地 ...

  8. Venn Diagram Comparison of Boruta, FSelectorRcpp and GLMnet Algorithms

    Feature selection is a process of extracting valuable features that have significant influence ondep ...

  9. 学习笔记TF016:CNN实现、数据集、TFRecord、加载图像、模型、训练、调试

    AlexNet(Alex Krizhevsky,ILSVRC2012冠军)适合做图像分类.层自左向右.自上向下读取,关联层分为一组,高度.宽度减小,深度增加.深度增加减少网络计算量. 训练模型数据集 ...

  10. 入职这一段时间的总结,Don't Repeat Yourself.

    1.第一次接触到大型软件系统的开发,现在我们使用的是 python + flask +vue.js ,数据库:postgresql 2. 不要在自己不懂的情况下复制代码,每次分析一段代码的时候,就跟以 ...