acm之路--DP
文章平均质量分 70
synapse7
这个作者很懒,什么都没留下…
展开
-
最长递增子序列(LIS)的O(NlogN)打印算法
题目:求一个一维数组arr[n]中的最长递增子序列的长度,如在序列1,5,8,3,6,7中,最长递增子序列长度为4 (即1,3,6,7)。方法一:一般的DP方法(O(N^2))像LCS一样,从后向前分析,很容易想到,第i个元素之前的最长递增子序列的长度要么是1(单独成一个序列),要么就是第i-1个元素之前的最长递增子序列加1,这样得到状态方程:原创 2013-09-17 09:39:02 · 7289 阅读 · 0 评论 -
POJ 1014 / HDU 1059 Dividing (多重背包&剪枝&单调队列)
http://poj.org/problem?id=1014参考了http://poj.org/showmessage?message_id=173435完整代码: /*0ms,376KB*/#include#includeconst int mx = 7;const int mxw = 1300;int m[mx], dp[mxw], deq[mxw],原创 2014-02-27 18:44:07 · 1024 阅读 · 0 评论 -
POJ 1276 Cash Machine (多重背包&单调队列)
http://poj.org/problem?id=1276模板题。完整代码:/*110ms,4316KB*/#include#includeconst int mx = 1005;const int mxw = 1000005;int w[mx], m[mx], dp[mxw], deq[mxw], deqv[mxw];int solve(int m原创 2014-02-27 14:48:50 · 1749 阅读 · 0 评论 -
整数划分小记
一、简单介绍参加wiki页面:http://en.wikipedia.org/wiki/Partition_(number_theory)二、基本形式例题:POJ 3014 Cake Pieces and Plates题意:(m的n划分的总数)给你m个东西,放在n个相同的盒子中,且每个盒子可以放任意多,问有多少种放法。思路:记原创 2014-02-21 00:12:26 · 1343 阅读 · 0 评论 -
UVa 11450 Wedding shopping (DP)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2445采用滚动数组实现。此外,这题颇有点模拟的味道。完整代码:/*0.035s*/#includeusing namespace std;bo原创 2014-02-25 16:28:30 · 1074 阅读 · 0 评论 -
UVa 10036 Divisibility (同余DP)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=977直接暴力肯定不行,都O(2^n)了,那么从同余的性质入手,定义dp[i][j]表示加到第i个数时是否能被j整除。那么可以得到如下状态转移方程:dp[i][(原创 2014-02-25 14:16:47 · 1459 阅读 · 0 评论 -
HDU 2159 FATE (二维费用完全背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2159参考《背包九讲》第5讲注意循环时,每次先杀一只怪,再选择不同的忍耐消耗。完整代码:/*0ms,276KB*/#include#include#includeusing namespace std;const int maxn = 105;int exp[max原创 2014-02-24 10:13:29 · 899 阅读 · 0 评论 -
UVA 10534 Wavio Sequence (双向LIS)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1475思路:以a[i]为Wavio Sequence的最大值,(根据定义)计算从0到i和从i到n的lis长度的较小者,为以a[i]为最大值的Wavio Sequence的半长度,最后取所有半长度的原创 2014-02-10 00:02:13 · 944 阅读 · 0 评论 -
Codeforces Round #119 (Div. 2) / 189A Cut Ribbon (完全背包)
A. Cut Ribbonhttp://codeforces.com/problemset/problem/189/Atime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard output原创 2013-08-29 21:19:33 · 2528 阅读 · 0 评论 -
动态规划(DP)——入门篇(11.24更新)
零、先修课程首先,在开始理解DP的思想前,你需要1. 完成HDU里面的递推求解专题练习(For Beginner)那7道题(这些题很简单,题解请在博客中搜索),这对你理解DP有很大的帮助。2. 对递归搜索(比如深度优先搜索,DFS)有一定了解。一、递归与记忆化搜索我们从POJ 3176入手来学习这一思想。(题目很短,请快速读完)从上往下看,最大和值无非是往左走和往右原创 2013-11-24 21:58:22 · 2711 阅读 · 1 评论 -
UVa 147 Dollars (完全背包)
147 - DollarsTime limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=83和UVa 357一样。注意所有数除以5再算。完整代码:/*0.019s*/#in原创 2013-11-19 09:00:53 · 1170 阅读 · 0 评论 -
SPOJ 345 Mixtures (区间DP&前缀数组)
http://www.spoj.com/problems/MIXTURES/和矩阵链乘类似,然后用前缀数组来计算从i到j的连续物品的混合颜色值。dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + ((sum[k] - sum[i - 1]) % 100) * ((sum[j] - sum[k]) % 100));完整代码:/原创 2014-02-05 17:24:11 · 1544 阅读 · 0 评论 -
UVa 674 Coin Change (完全背包&最优解的方案数)
思路:从上往下分析,嗯。。。一个五叉树。所以干脆从下往上递推:dp[i] = dp[i] + dp[i - coin[k]]完整代码:原创 2013-09-23 00:00:47 · 1391 阅读 · 0 评论 -
UVa 10891 Game of Sum (区间DP&博弈)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=1832思路:for (int i = 1; i <= b - a; i++) ans = max(ans, sum[b] - sum[a] - min(f(a +原创 2014-02-05 23:42:33 · 937 阅读 · 0 评论 -
UVa 348 Optimal Array Multiplication Sequence (区间DP&矩阵链乘,MCM)
348 - Optimal Array Multiplication SequenceTime limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=284记忆化搜索:dp[原创 2013-11-25 14:28:45 · 996 阅读 · 0 评论 -
UVa 357 Let Me Count The Ways (完全背包)
357 - Let Me Count The WaysTime limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=293思路:dp[i] += dp[i - coin[原创 2013-11-19 08:48:00 · 2070 阅读 · 0 评论 -
HDU 2639 Bone Collector II (0-1背包第k优解)
http://acm.hdu.edu.cn/showproblem.php?pid=2639参考背包九讲9.5节,注意合并单调队列的技巧(末尾加一个-1标记)完整代码:/*109ms,488KB*/#include#include#include#includeusing namespace std;int w[105], v[105], dp[1005原创 2014-02-20 21:36:35 · 927 阅读 · 0 评论 -
O(NV)的完全背包算法 及 HDU 4508 湫湫系列故事——减肥记I (完全背包)
介绍:完全背包:有N种物品和一个容量为V的背包,每种物品都有无限件可用。放入第i种物品的价值是Wi,所占空间是Ci。求解:将哪些物品装入背包,可使这些物品体积总和不超过背包容量,且价值总和最大。题目可以转化为在Σ(i=1~N) kiCi 思路:temp = f[j - c[i]] + w[i];if (f[j] < temp) f[j] = temp;读原创 2013-07-31 09:42:53 · 1183 阅读 · 0 评论 -
HDU 2686 Matrix (双线程DP)
http://acm.hdu.edu.cn/showproblem.php?pid=2686双线程,嗯,好名字。每次DFS传两个点的坐标,别让它们重合就行。额外说一句,数据中有0完整代码:/*78ms,6112KB*/#include#include#includeusing namespace std;const int mx = 35;原创 2014-02-27 17:40:19 · 881 阅读 · 0 评论 -
UVa 11151 Longest Palindrome (另一种最长回文&LCS)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2092思路:求的是非连续子串的最长回文,而n完整代码:/*0.075s*/#includeusing namespace std;char a[1005], b[1005原创 2014-02-17 15:03:52 · 992 阅读 · 0 评论 -
HDU 2126 Buy the souvenirs (贪心&0-1背包最优解的个数)
http://acm.hdu.edu.cn/showproblem.php?pid=2126由于身上的钱相当于背包容量,价格相当于重量,由于我们要买尽量多的物品,所以每件物品的价值就为1在价值都相等的情况下,我们可以用贪心的思想求出最多能买多少件物品——排个序就行了最后就是怎么就最优解的方案数,如下:for (j = 0; j <= maxw; ++j) selection原创 2014-02-20 15:59:13 · 954 阅读 · 0 评论 -
POJ 1141 / UVa 1626 Brackets Sequence (区间DP&打印路径)
http://poj.org/problem?id=1141怎么记录路径?定义divide_pos[i][j]为i到j这一段的最佳添加括号位置,若这一段本身就不需要添加括号,则置-1完整代码:/*0ms,416KB*/#include#includeconst int mx = 100;char s[mx];int dp[mx][mx];///最小添加原创 2014-02-28 16:53:38 · 1164 阅读 · 0 评论 -
LightOJ 1085 All Possible Increasing Subsequences (DP&离散化&树状数组)
http://lightoj.com/volume_showproblem.php?problem=1085先说个很快的方法——二维思考,从右下往左上离散化:/*0.364s,2860KB*/#includeusing namespace std;const int mx = 100005;const int mod = 1000000007;int tree[m原创 2014-03-25 21:28:21 · 1612 阅读 · 0 评论 -
SGU 104 Little Shop of Flowers (DP&打印路径)
http://acm.sgu.ru/problem.php?contest=0&problem=104/*15ms,142KB*/#includeusing namespace std;const int mx = 105;int a[mx][mx], dp[mx][mx], f;void print(int i, int j){ if (i == 0) retur原创 2014-03-23 18:35:29 · 1388 阅读 · 0 评论 -
POJ 2385 Apple Catching (DP)
Apple Catchinghttp://poj.org/problem?id=2385Time Limit:1000MS Memory Limit:65536KBDescriptionIt is a little known fact that cows love apples. Farmer John has two apple原创 2013-11-02 21:51:41 · 1279 阅读 · 0 评论 -
HDU 3853 LOOPS (概率DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3853令dp[i][j]表示从(i,j)到(R,C)花费的魔力值的期望。那么,我们有:dp[i][j] = 2 + ploop[i][j]*dp[i][j] + pleft[i][j]*dp[i][j+1] + pdown[i][j]*dp[i+1][j]移项可得:if (ploo原创 2014-03-07 22:39:34 · 918 阅读 · 0 评论 -
数位DP小记 + HDU 2089 不要62
【背景】如何求出在给定区间[A,B]内,符合条件P(i)的数i的个数?条件P(i)一般与数的大小无关,而与数的组成有关,有一下几种P(i):数i是递增/递减的:1234, 2579,…双峰的:19280,26193,…含/不含某一数字的,比如含49:49, 149, 1492,… 被某一数m整除的,比如m=13:39,130,650...【思路】采用原创 2014-03-11 13:14:59 · 1935 阅读 · 1 评论 -
Codeforces Round #235 (Div. 2) / 410D Roman and Numbers (带有整除性质的数位DP)
http://codeforces.com/problemset/problem/401/D解释全部在代码的注释中:/*78ms,205464KB*/#includeusing namespace std;const int mx = 1 << 18;long long dp[mx][100];///dp[mask][j]表示余数为j时的mask对应的x的个数///原创 2014-03-11 20:25:34 · 2065 阅读 · 0 评论 -
UVa 10285 / POJ 1088 Longest Run on a Snowboard (记忆化搜索)
10285 - Longest Run on a SnowboardTime limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=1226递归写就写。完整代码原创 2013-11-18 19:30:02 · 1125 阅读 · 0 评论 -
HDU 2602 Bone Collector (经典0-1背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2602/*31ms,240KB*/#include#include#includeusing namespace std;const int mx = 1005;int w[mx], v[mx], dp[mx];void _01pack(int n, int maxw){ me原创 2014-02-20 05:38:11 · 1052 阅读 · 0 评论 -
HDU 2955 Robberies (想法题&0-1背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2955如何变形呢??int _01pack(int n, int maxw){ memset(dp, 0, sizeof(dp)); dp[0] = 1.0;///初始化这个 int i, j; for (i = 0; i < n; ++i) for (j = maxw; j >=原创 2014-02-20 06:54:33 · 825 阅读 · 0 评论 -
POJ 2184 Cow Exhibition (想法题&双变量0-1背包)
http://poj.org/problem?id=2184dp[s]表示当TS=s时,TF的最大值。if (s > 0){ for (j = Max; j >= Min; --j) dp[j + s] = max(dp[j + s], dp[j] + f);///dp[s]表示当TS=s时,TF的最大值 Max += s;}else{ if (f <=原创 2014-02-20 09:44:57 · 875 阅读 · 0 评论 -
HDU 2546 饭卡 (需要一些思考的0-1背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2546先给菜价排个序,然后:printf("%d\n", m 完整代码:/*62ms,240KB*/#include#include#includeusing namespace std;const int mx = 1005;int w[mx], dp[mx];原创 2014-02-20 06:03:39 · 778 阅读 · 0 评论 -
HDU 4745 Two Rabbits (最长回文变形)
http://acm.hdu.edu.cn/showproblem.php?pid=4745/*31ms,4192KB*/#include#include#includeusing namespace std;const int mx = 1005;int dp[mx][mx];///从i到j的最长回文串的长度int w[mx];int solve(int n)原创 2014-03-01 21:04:29 · 933 阅读 · 0 评论 -
POJ 1651 / ZOJ 1602 / Northeastern Europe 2001 Multiplication Puzzle(dp)
Multiplication Puzzlehttp://poj.org/problem?id=1651Time Limit: 1000MSMemory Limit: 65536KDescriptionThe multiplication puzzle is played with a row of cards, each contai原创 2013-07-31 14:57:19 · 1328 阅读 · 0 评论 -
POJ 3211 Washing Clothes (平衡划分&01背包)
http://poj.org/problem?id=3211既然两个人可以同时洗同色的衣服,那么对每种颜色进行分析,转化为在sumtime/2的时间内能洗至多多久的衣服,则洗这种颜色的衣服至少用时sumtime-01pack(sumtime/2)完整代码:/*32ms,968KB*/#include#include#include#includeusing原创 2014-02-27 21:14:42 · 906 阅读 · 0 评论 -
UVa 10074 Take the Land (转化思想&最大子矩阵和)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1015首先将原问题转化为最大子矩阵和问题:0 -> 11 -> -1000对于最大子矩阵和问题,可以利用前缀和转化为一维的最大子序列和问题(见代码)原创 2014-02-28 15:35:18 · 1828 阅读 · 0 评论 -
POJ 1631 / HDU 1950 / ZOJ 1986 / Northwestern Europe 2003 Bridging signals (DP&LIS)
LIS(最长递增子序列):有一列互不相等数arr[n],从中取出k个数使得lis[k]单调递增,求k的最大值。读一个数就计算一次。当它是第一个数时,我们就把它存到lis[1];当它不是第一个数时,就在lis中查找小于它且离它最近的数lis[i],加到lis中(替换掉lis[i+1]),找不到的话就说明它最小,我们替换掉lis[1];注意两点:1. 请使用二分查找原创 2013-07-30 16:08:35 · 1438 阅读 · 0 评论 -
POJ 1458 / HDU 1159 / Southeastern Europe 2003 Common Subsequence (DP&LCS)
介绍:LCS(最长公共子序列):给两个序列a,b,求出最大公共子序列的长度思路:dp[i][j] = (a[i] == b[j] ? 1 + dp[i - 1][j - 1] : max(dp[i - 1][j], dp[i][j - 1]));代码如下:/*POJ: 0ms,964KB*//*HDU: 31ms,2176KB*/#include原创 2013-07-30 20:06:00 · 1258 阅读 · 0 评论 -
UVa 10081 Tight Words (DP)
10081 - Tight WordsTime limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1022思路:长度为i的串,如果其末尾数是j,那么这样的串的个数必为长原创 2013-11-16 16:54:10 · 1317 阅读 · 0 评论