
动态规划
CCSUZB
吾生也有涯,而知也无涯
展开
-
钢条切割
问题描述解题思路:我们可以进行划分为更小的子问题,钢条的最大收益就是分为两种情况,一是钢条不要切割时能够获得最大收益,另一种时钢条要切割时获得最大收益,对于要切割的钢条我们又可以进行切割与不切割的讨论。除了上面解法,钢条还可以从左边切割下长度为i的一段,所以右边就只剩下Len-i的长度了,就只对右边进行切割(递归求解),左边就不再切割。所以为题分解为左边一段(不管)和剩余右边一段继续切割的结果自顶向原创 2017-07-10 20:19:43 · 356 阅读 · 0 评论 -
POJ 3903-最长上升子序列
题目链接最长上升子序列 这道题采用DP做法的时间复杂度是O(n2)会超时所以采用O(nlogn)的算法O(n2)算法#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <string> #include <string.h> #include <cmath> #include原创 2017-08-12 10:12:18 · 338 阅读 · 0 评论 -
POJ 1976-动态规划
动态规划有n个车厢每个车厢有一定的乘客 现在用三个车头去拉这些车厢,每个车头能拉的最大车厢数量是m 而且这k个车厢必须是连续的 求这三个车头能拉的最大乘客数量转移方程:DP[i][j]=max(DP[i-1][j],DP[i-m][j-1]+a[i]-a[i-m])DP[i][j]表示前i个车厢用j个车头能拉的最大数量 当第i个车厢不拉时为DP[i-1][j] 第i个车厢拉时为DP[i-m][j-原创 2017-08-17 15:26:54 · 567 阅读 · 0 评论 -
Uva10118
题目链接用一个四维数组记录状态dp[a][b][c][d]表示分别从1,2,3,4堆糖果取出a,b,c,d个时能获得多少对糖果。当从某一堆取出一个糖果时,当取出的这个糖果与篮子糖果颜色相同时有dp[a+1][b][c][d]=dp[a][b][c][d]+1, 不相同时dp[a+1][b][c][d]=dp[a][b][c][d].#include <iostream> #include <c原创 2017-07-23 20:55:34 · 565 阅读 · 0 评论 -
Uva10911 最优匹配问题
题目链接集合上的动态规划,设d(i,S)表示把前i个点中,位于集合S中的元素两两配对的最小距离和,状态转移方程:d(i,S)=min{|PiPj|+d(i-1,S-{i}-{j}) | j∈S}, |PiPj|表示Pi和Pj间的距离,而上面的方程可以进一步简化,阶段i不必要保存,因为i已经包含在集合S中了,而且S表示的是前i个点的集合,所以i是集合中最大的元素,则d(S)表示“把S中的元素两两配对的原创 2017-07-19 19:30:04 · 542 阅读 · 0 评论 -
Uva1220
题目链接入门树形DP思路:设d(u,0),f(u,0)是以u为根的子树中不选u点时能够得到的最大人数和表示方案唯一【f(u,0)表示方案唯一,f(u,1)表示方案不唯一】,d(u,1),f(u,1)表示选u点时能够得到的最大人数和表示方案唯一。所以转移方程也有两种,一种是d(u,1)的计算,因为选了u点,所以u的直接子节点都不能选,因此d(u,1)=sum{d(v,0)|v是u的直接子节点不能选},原创 2017-07-19 13:41:01 · 411 阅读 · 0 评论 -
Uva1252
题目链接给出一个例子来理解题意:m=5,n=4时有10100110000000100010从左到右表示1-m个特征,现在询问第一个位置就可以把原来四组分为{(1),(2)}和{(3),(4)} 然后再区分(1)和(2)可以询问位置2或3 区分(3)和(4)可以询问位置4或5。假设所要猜的物体为w,我们用一个集合s表示所询问的特征,用集合a表示在集合s里面w所具有的特征,即a是s的子集。d(s,原创 2017-07-21 18:39:24 · 357 阅读 · 0 评论 -
Uva10817
题目链接#原创 2017-07-21 13:29:27 · 556 阅读 · 0 评论 -
POJ1661
题目链接jimmy要从上开始往下落使得时间最少,所以可以看为从左边走和右边走的从这两个子问题中寻找最优解 设DP[n][0]为从左边走获得的最短时间DP[n][1]为从右边走获得最短时间 但是因为Jimmy开始所处的位置为一个点没有左右之分所以最终的结果DP[n][0]=DP[n][1] 时间相等#include <iostream> #include <cstring> #include <st原创 2017-07-08 19:47:11 · 321 阅读 · 0 评论 -
POJ3254
题目链接感谢今天天气不错和我叫MK的题解,自己也写一下自己第一题的入门题,第总共有m行n列,每个格子可以分为放或者不放两种状态,我们可以用0和1表示‘0’代表不放‘1’代表放。所以每一行对应的状态有2^n个,由于后面一行状态是由前一行决定的,我们可以得到一种状态dp[i][state(j)]表示前i行采用的状态为state(j)时能够得到的可行方案数,例如我们在第2行放置时肯定要基于第一行的情况放置原创 2017-07-20 21:11:42 · 288 阅读 · 0 评论 -
FZU2186
题目链接#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> #include <queue> using namespace std;const int maxn = 110; const int INF = 0x3f3f3f3f; int n, m, tot; i原创 2017-07-20 15:40:21 · 252 阅读 · 0 评论 -
硬币问题
题目描述:刘汝佳紫书262页思想:固定长度的最长和最短路求最长路的记忆化搜索方法D[i]表示从当前节点i出发到达0的最长路径 注意D[0]必须赋予初始值因为0到0的路径长度为0 不然无法算出正确结果 (代码中把ans改到一个最大值就可以求出相应的最短路)#include <cstdio> #include <cstring> #include <iostream> #include <algori原创 2017-07-07 10:16:14 · 359 阅读 · 0 评论 -
POJ 1141
题目链接d[i][j]为字符串str[i~j]需要添加多少个括号,可以分为以下两种情况,当字符串形如’(s)’=和‘[s]’时就只要计算字符串s需要添加多少括号使之匹配,不必要管外面的已经匹配好的’()’和’[]’。当字符至少有两个时可以找个分界点K计算d(i,k)+d(k+1,j)。但不管字符是否满足第一条,都要尝试第二种,例如字符’[][]’,如果不尝试第二种转移,就会转移到’][‘,然后就只能原创 2017-07-13 17:14:12 · 297 阅读 · 0 评论 -
多重背包
HDU 2191我们可以将多重背包分解为0-1背包和完全背包,当物品的(价格*数量)超过总金额时就可以看做是完全背包问题反之就可以看做是0-1背包问题。在转化成0-1背包时有个地方需要注意,我们可以把第i中物品的数量c[i]分成若干数量的集合比如物品i的数量有7种,就可以化为{1,2,4}可以用这集合里面三个元素组合成1~7中任意一种数量,分解的方法为:1,2,4,…….,c[i]-2^k+1#in原创 2017-07-13 10:18:11 · 311 阅读 · 0 评论 -
物品无限的背包问题
问题描述:物品无限的背包问题。有n种物品,每种均有无穷多个。第i种物品的体积为Vi,重量 为Wi。选一些物品装到一个容量为C的背包中,使得背包内物品在总体积不超过C的前提下 重量尽量大。1≤n≤100,1≤Vi ≤C≤10000,1≤Wi≤106。解决思路:与硬币问题一样只是变成了带有权重DAG只需要将所需要的硬币数量改成物品的价值就行了#include <iostream> #include <q原创 2017-07-09 10:36:53 · 1861 阅读 · 0 评论 -
0-1背包问题
问题描述:有n种物品,每种只有一个。第i种物品的体积为Vi,重量为Wi。选一些 物品装到一个容量为C的背包,使得背包内物品在总体积不超过C的前提下重量尽量大。 1≤n≤100,1≤Vi≤C≤10000,1≤Wi≤10 6。解题方法①:d(i,j)=max(d(i+1,j),d(i+1,j-v[i])+w[i])d(i,j)的意思是把(i,i+1,i+2,……..n)个物品装到容量为j的背包中的总重量原创 2017-07-09 11:28:00 · 461 阅读 · 0 评论 -
HDU 1025-最长上升子序列
题目链接包装了的最长上升子序列题目#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <string> #include <string.h> #include <cmath> #include <sstream> #include <set> #include <map>原创 2017-08-18 13:54:49 · 285 阅读 · 0 评论