随笔分类 -  专题--DP

摘要:链接 分析:来看看背包九讲里面的一段话: 对于一个给定了背包容量、物品费用、物品间相互关系(分组、依赖等) 的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得 到装满背包或将背包装至某一指定容量的方案总数。对于这类改变问法的问题,一般只需将状态转移方程中的max改成sum即可。例如 阅读全文
posted @ 2017-09-30 00:02 wolf940509 阅读(169) 评论(0) 推荐(0)
摘要:链接 分析:dp[i][j]表示前i个数,组成j,最少需要多少个。dp[i][j]=min(dp[i-1][j],dp[i-1][j-k*v[i]]+k),则可以转化为完全背包问题,同样的方法进行降维处理即可。 1 #include "iostream" 2 #include "cstdio" 3 阅读全文
posted @ 2017-09-25 21:56 wolf940509 阅读(182) 评论(0) 推荐(0)
摘要:链接 分析:裸的完全背包问题 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 const int maxn=1e5+100; 7 i 阅读全文
posted @ 2017-09-25 10:58 wolf940509 阅读(181) 评论(0) 推荐(0)
摘要:51Nod1086 分析:二进制优化多重背包,推荐一篇不错的blog,点我 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 cons 阅读全文
posted @ 2017-09-21 16:18 wolf940509 阅读(105) 评论(0) 推荐(0)
摘要:最大独立集问题是指对于一棵n个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻,解答过程详见入门经典第二版280页,粘代码跑QAQ 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "strin 阅读全文
posted @ 2017-08-10 22:53 wolf940509 阅读(589) 评论(0) 推荐(0)
摘要:UVA11400 分析:首先我们需要明白一个问题,就是每种电压的灯泡要么就是全部替换,要么全部不替换,为什么呢?因为如果只替换一半,那两种电源都需要,不划算,从另一个方面来说,既然转化一半会比原来小,那为什么不全部转换呢?接着根据题意我们应该把灯泡按照电压从小到大排序。然后我们令dp[i]表示1~i 阅读全文
posted @ 2017-08-06 21:40 wolf940509 阅读(362) 评论(0) 推荐(0)
摘要:每做一次决策就可以得到解的一部分,当所有决策做完以后,完整的解就"浮出水面“。在回溯法中,每次决策对应于给一个结点产生新的子树,而解的生成过程对应一颗解答树,结点的层数就是下一个待填充的位置 UVA116 分析:dp[i][j]记录从(i,j)出发的最小值,本题同时还要求输出字典序最小的解,所以需要 阅读全文
posted @ 2017-07-24 15:36 wolf940509 阅读(385) 评论(0) 推荐(0)
摘要:UVA1025 分析:因为时间是单向流逝的,是天然的"序",所以影响决策的只有当前时间和所处的决策。dp[i][j],表示在第i分钟时,处于第j个车站,最少还需要多少等待时间,因此其等待时间就有站原地等待,乘坐从左到右的车,乘坐从右到左的车,三个状态来决定。 1 #include "iostream 阅读全文
posted @ 2017-07-23 02:34 wolf940509 阅读(358) 评论(0) 推荐(0)
摘要:石子合并 链接 分析:dp[i][j]表示从i顺时针数j个位置的最大值,规划方向是顺推,初始时dp[i][i]=0。显然,我们需要求出合并个数为2,3,,,,n的情况,对于dp[i][j]我们假设最后一次合并位置为k,dp[i][j]=dp[i][k]+dp[k+1][j]+sum[i,j],因为s 阅读全文
posted @ 2017-07-17 01:46 wolf940509 阅读(200) 评论(0) 推荐(0)
摘要:链接 分析:依赖型0-1背包问题,对于一个主件,可以挂0个,1个,2个附件,所以最终为4种状态情况下的最大值。 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using nam 阅读全文
posted @ 2017-07-13 12:54 wolf940509 阅读(164) 评论(0) 推荐(0)
摘要:链接 分析:卡特兰数,具体请看,注意一下组合数的求法 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 const int maxn= 阅读全文
posted @ 2017-06-18 15:50 wolf940509 阅读(91) 评论(0) 推荐(0)
摘要:链接 分析:经典DP题,最长不下降子序列的变种,同时需要记录路径,用pre[]数组记录当前结点的前一个结点的方法很妙 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 #inclu 阅读全文
posted @ 2017-06-17 13:50 wolf940509 阅读(143) 评论(0) 推荐(0)
摘要:链接 分析:当前点的情况仅由其左边和上边的点决定,然后马会走过的点标记一下即可 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 co 阅读全文
posted @ 2017-06-17 13:49 wolf940509 阅读(181) 评论(0) 推荐(0)
摘要:链接 分析:对前半部分求最长上升,对后半部分,求最长下降,二者的最大值即为所求,注意重复的部分 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace s 阅读全文
posted @ 2017-06-15 00:55 wolf940509 阅读(168) 评论(0) 推荐(0)
摘要:链接 分析:这题要求满足最长下降子序列的个数,我们设dp[i]为i位置的最长下降子序列长度,f[i]为i位置对应的个数。考虑j<i,若是满足a[i]==a[j]&&dp[i]==dp[j],我们应该进行去重,这时我们应取后一个位置,因为无论如何,后一个位置所取得的最长下降子序列的长度都不小于前一个位 阅读全文
posted @ 2017-06-14 21:44 wolf940509 阅读(99) 评论(0) 推荐(0)
摘要:前导技能: 递归,暴搜 本质: 递归 原问题->子问题->原问题 最有子结构: 子问题最优决策可导出原问题最优决策 无后效性 重叠子问题: 去冗余 空间换时间 Leetcode198 链接:https://leetcode.com/problems/house-robber/ 题意:要去抢n家店,相 阅读全文
posted @ 2017-01-30 12:13 wolf940509 阅读(219) 评论(0) 推荐(0)
摘要:poj2184 题意:给定奶牛的一些智慧跟幽默值,求在智慧跟幽默值都大于0时,智慧跟幽默的最大值 分析:这题要好好总结一下,看了题解才做出来的。一道很经典的01背包变种题。这里我们将智慧看成容量,幽默看成价值,当智慧为正数时,因为我们后面的状态是由前面的状态来定义的,所以我们采用从大到小逆推,就是普 阅读全文
posted @ 2016-05-02 00:13 wolf940509 阅读(163) 评论(0) 推荐(0)
摘要:poj3666 题意:将一串数改成非严格的上升或者非严格的下降,最少要改变多少 分析:一道非常经典的dp题,看了网上别人的思路才解决的。我们的目的是要将其改成非严格的单增或单减,并且求其最少的改变,所以对于那些不符合要求的点,我们使它变得跟前一个或者是后一个相同时,我们得到的改变才是最少的,这样,我 阅读全文
posted @ 2016-04-26 22:54 wolf940509 阅读(166) 评论(0) 推荐(0)
摘要:poj1065 题意:给定木棒的长度和重量,将n跟木棒进行加工,若后一根木棒的长度和重量都大于前一跟,则可以继续进行加工,否则需要停下来重新对刀,开始第一次要停下来一次,问最少停下来几次 分析:一个非常好的dp题目,需要好好总结一下,我们可以将木棒按照长度和重量任意一个进行升序排序,对另外一个求最长 阅读全文
posted @ 2016-04-25 00:13 wolf940509 阅读(124) 评论(0) 推荐(0)
摘要:poj3181 题意:问用1到k组成n共有多少种组成方法 分析:用dp[i][j]纪录前i种数相加得到j共有多少种方法 (1)若j-i>=0,dp[i][j]=dp[i-1][j]+dp[i][j-i] (2)dp[i][j]=dp[i-1][j] 注意这个地方会爆long long,要用高精度,用 阅读全文
posted @ 2016-04-23 18:19 wolf940509 阅读(127) 评论(0) 推荐(0)