摘要: DP对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢!----第一节----初识动态规划--------经典的01背包问题是这样的:有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最大价值是多少 阅读全文
posted @ 2013-08-05 22:28 执着追求的IT小小鸟 阅读(236) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2533简单的dp运用于求最长有序子序列,这里是递增我们假设原数列定义为数组a[],然后定义一个数组b[i],表示以a[i]结尾的最长公共子序列的长度,只要求出所有的b[i]数组也就可以确定最长的公共子序列, 那么我们根据已经求出的b[0]--b[i-1],来求b[i]呢,,也就如何求出以a[i]结尾的最大公共子序列的长度呢, 此时在a[0]-a[i-1]范围内,已经求出多个长度的公共子序列,且最大长度的一个序列的长度为s,这个序列的最后一个元素为t,那么 1.如果a[i]t,这时候就会比较的麻烦了,因为a[i]不可能成为长度为s的最长公共子 阅读全文
posted @ 2013-08-05 22:17 执着追求的IT小小鸟 阅读(160) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1257贪心,一次把后面的高度或覆盖到前面比他高的上面,或自成一组#include#includeint a[1000000],b[1000000];int main(){ int i,j,n,k; while(~scanf("%d",&n)) { k=0; memset(b,0,sizeof(b)); for(i=0;ia[i]) { b[j]=a[i]; break; ... 阅读全文
posted @ 2013-08-05 21:32 执着追求的IT小小鸟 阅读(128) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1003初识dp,大问题是求出总序列的最大和,而每个数都有加到前面作为前面已经加好的和的增量和自己独立成为一个“最大和”的选择,在这两个选择中的最大和就是局部的最大和,而保存好第一个最大和,将整个序列的所有局部最大和都求解出来,就能得到全列的最大和#includeint main(){ int i,ca=1,t,s,e,n,x,now,before,max; scanf("%d",&t); while(t--) { scanf("%d",&n); for( 阅读全文
posted @ 2013-08-05 16:38 执着追求的IT小小鸟 阅读(152) 评论(0) 推荐(0) 编辑