USACO Dynamic Programming (1)
首先看一下题目:
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个整数暂时换成别的数目的整数。
以下是官方给出的最朴素的解法,我在上做了一些微小的修改。这种做法的实质就是把所有的递减序列找出来,然后找出长度最长的。
#include <iostream>
#include <cstdio> using namespace std;
const int maxn = ;
int n;
int sequence[maxn]; int check(int start, int nmatches, int smallest); int main() {
freopen("test.in", "r", stdin);
cin >> n;
for(int i = ; i < n; i++) {
cin >> sequence[i];
}
cout << check(, , );
return ;
} int check(int start, int nmatches, int smallest) {
cout << "Check!" << endl;
cout << start << " " << nmatches << " " << smallest << endl;
int better;
int best = nmatches;
for(int i = start; i < n; i++) {
if(sequence[i] < smallest) {
better = check(i, nmatches + , sequence[i]);
if(better > best) {
best = better;
}
}
}
return best;
}
其中,text.in的数据是我随机生成的,如下:
这里的check函数是使用了递归的,递归的终止条件是for循环运行结束,递归的状态转移是在添加了新的数字到递减序列后能达到的最大长度。
如果对于算法一下不能看懂的话,那么可以对照着运行结果看。
运行结果如下:
Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check! Check!
这里是说,对于递减子序列,我们需要把每一个在原序列中的可能成为当前子序列的末尾元素的元素进行测试。就比如最小子序列的第0号元素,因为任何一个元素都可以成为一个长度为1的递减子序列的,所以最小子序列的第0号元素可能是64,65,97,43,5,36,92,72,87,44中的任何一个。但是假设我们已经选定了第0号元素是64,那么第1号元素就有可能是43,5,36,44中的任意一个。
64 65 97 43 5 36 92 72 87 44
USACO Dynamic Programming (1)的更多相关文章
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- Dynamic Programming
We began our study of algorithmic techniques with greedy algorithms, which in some sense form the mo ...
- HDU 4223 Dynamic Programming?(最小连续子序列和的绝对值O(NlogN))
传送门 Description Dynamic Programming, short for DP, is the favorite of iSea. It is a method for solvi ...
- hdu 4223 Dynamic Programming?
Dynamic Programming? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- 算法导论学习-Dynamic Programming
转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...
- Dynamic Programming: From novice to advanced
作者:Dumitru 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg An impo ...
- HDU-4972 A simple dynamic programming problem
http://acm.hdu.edu.cn/showproblem.php?pid=4972 ++和+1还是有区别的,不可大意. A simple dynamic programming proble ...
- [算法]动态规划(Dynamic programming)
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4603173.html Dynamic Programming的Programming指的不是程序而是一种表格 ...
- hdu 4972 A simple dynamic programming problem(高效)
pid=4972" target="_blank" style="">题目链接:hdu 4972 A simple dynamic progra ...
随机推荐
- 转:Java中的Clone()方法详解
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- HotSpot的算法实现
1.枚举根节点 可达性分析中从GC Roots节点找引用,可作为GC Roots的节点主要是全局性的引用与执行上下文中,如果要逐个检查引用,必然消耗时间.另外可达性分析对执行时间的敏感还体现在GC停顿 ...
- php 知识点 --个人笔记
##2015-09-06 为防止用户看到错误信息,而出现的不友好界面.故一般性会在php.ini里设置:display_errors = Off;不过在开发的时候,我们有时候需要打开错误信息.这时候, ...
- Mybatis中的like查询
今天要做一个模糊查询 用的Mybatis 开始写的是: select id,bookName,author,publisher,donor,status,createDate,lastUpdate f ...
- .Net Core中使用ref和Span<T>提高程序性能
一.前言 其实说到ref,很多同学对它已经有所了解,ref是C# 7.0的一个语言特性,它为开发人员提供了返回本地变量引用和值引用的机制. Span也是建立在ref语法基础上的一个复杂的数据类型,在文 ...
- .nomedia文件的作用
.nomedia文件的作用:应用中的图片不被系统图库扫描. 一般开发的应用中会缓存一些图片到本地,不想让系统图库扫描到应用的图片或者不想对用户浏览图片造成影响. .nomedia文件放在任何一个文件夹 ...
- 简单的用jQuery做遮罩效果
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- [原创]MySQL数据库忘记root密码解决办法
MySQL数据库忘记root密码解决办法 1.在运行输入services.msc打开服务窗体,找到MYSQL服务.右键停止将其关闭.如图:
- 快速找到ARP病毒源
第一招:使用Sniffer抓包 在网络内任意一台主机上运行抓包软件,捕获所有到达本机的数据包.如果发现有某个IP不断发送请求包,那么这台电脑一般就是病毒源.原理:无论何种ARP病毒变种,行为方式有两种 ...
- idea的一揽子工程
我总觉得,世上如果人人都像我一样,那路该多难走.有时候在网上找到一些问题的答案,成功解决之后,就这么过去了,实在罪过. 将idea的几个常见的使用问题综合到一起吧,如果有不会用的,欢迎留言.当然,请支 ...