![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
文章平均质量分 59
无敌大饺子
这个作者很懒,什么都没留下…
展开
-
POJ2192 | ZOJ 2401 Zipper
题意:给出3个字符串A,B,C 判断第3个字符串是否可以通过前2个串穿插变成.设dp[i][j]表示A的前i个字符串和B的前j个字符串是否能够构成C的前i + j个字符.则dp[i][j] = max(dp[i - 1][j] * (A[i - 1] == C[i + j - 1]), dp[i][j - 1] * (B[j - 1] == C[i + j - 1])).这里字符串索引从0原创 2014-03-15 14:16:05 · 465 阅读 · 0 评论 -
ZOJ 1163 The Staircases(01背包)
题意:求N块砖头能搭成多少种不同的楼梯,要求楼梯每一阶所组成的砖头数都不一样.思路:相当于求用i个数组成N能有多少种方法.dp[i][j]为前i个数组成j的方案数.dp[i][j] = sum(dp[i - 1][j - i]).意思是前i - 1个数组成j - i的方案数.可以用滚动数组优化,本质上其实就是一个01背包,容量为j,重量为i注意用long long;#inc原创 2014-04-02 17:04:40 · 859 阅读 · 0 评论 -
ZOJ 1642 Match for Bonus(LCS)
题意:给出每个字符的权值,求两个字符串的子序列能够获得的最多权值.解法:就是LCS问题,只不过长度变成了权值.题目里没给出字符长度WA好几次,2300左右就差不多了.#include #include #include using namespace std;const int MAX = 2200;int dp[MAX][MAX];int bonus[256];cha原创 2014-04-02 17:58:44 · 459 阅读 · 0 评论 -
vijos 1038 添加括号
石子合并类似的问题,要求找出括号的添加方法,最小中间和之和,各个中间和.设dp[i][j]为i到j之间最小中间和之和则dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j] | ibase case:dp[i][i] = 0#include #include #include using namespace s原创 2014-03-23 21:32:23 · 935 阅读 · 0 评论 -
ZOJ 1602 Multiplication Puzzle(矩阵连乘)
题意:给出一排卡,每次能拿走除了第一张和最后一张之外的任何卡,拿走卡i之后要加上卡i和卡i-1和卡i+1的乘积,直到剩下第一张和最后一张为止,求最少的乘积和.设dp[i][j]为拿走i..j之间卡的最少乘积和,那么答案就是dp[1][N]dp[i][j] = min{dp[i][k[ + dp[k][j] + C[i] * C[k] * C[j]] | ibase cases: dp[原创 2014-04-02 20:40:02 · 732 阅读 · 0 评论 -
ZOJ 1428 Magazine Delivery(DP)
题意:有一堆杂志要送到N个地点,有3两出租车可以用,每辆杂志可以载无限多的杂志,初始3两车都在1地点,两地点距离由D[i][j]给出,第i个地点只有第i- 1个地点送了杂志之后才能送,求使用3两车送完杂志的最少距离.思路:题目中的条件:第i个地点只有第i- 1个地点送了杂志之后才能送 给出了很好的一个阶段划分.设dp[i][j][k][m]为送第i个地点的时候3两车分别在j,k,m位置原创 2014-04-03 20:57:15 · 617 阅读 · 0 评论 -
vijos 1121马拦过河卒
设dp[i][j]为从[0,0]到[i,j]的方案数,那么dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 这里i - 1 和j - 1必须在边界里并且[i - 1, j]和[i, j - 1]必须不能被马控制.用的是记忆化搜索.#include #include using namespace std;const int MAX = 20;bool r原创 2014-03-25 14:31:24 · 564 阅读 · 0 评论 -
ZOJ 2402 Lenny's Lucky Lotto Lists(简单DP)
题目大意:给出两个整数M,N 在1~M的范围里选出N个数,条件是第i个数必须大于等于第i-1个数的两倍, 求总共能选出的方案数.设dp[i][j]为1~i选择j个数出来的方案数,那么dp[k][j + 1] += dp[i][j] (2 * i#include #include using namespace std;const int MAX = 2001;long long原创 2014-03-25 14:28:47 · 510 阅读 · 0 评论 -
UVA 20002 Partitioning by Palindromes(简单DP)
题意:给出一个字符串,求能最少划分成几个连续子串,使得每个子串都是回文串.思路:设dp[i]为前i个字符划分的最优解,那么dp[i] = min(dp[i], dp[j] + 1)这里满足满足j + 1..i为一个回文串.可以用一个二维数组预处理求出x...y的串是否为回文串来做.#include #include #include using namespace std;原创 2014-04-17 17:16:43 · 601 阅读 · 0 评论 -
vijos 1218 数字游戏(环形dp)
第一次接触环形的dp,学到了一招:把环复制一次就变成了线了,不过复杂度同样也要上一层.枚举每一个切割点k,对[k, k + n]序列做如下dp:设dp[i][j]为前i个数字分成j堆能得到最大/最小值.则dp[i][j] = max/min{dp[p][j - 1] * (sum(p + 1, i) % 10) | 1 base case:dp[i][1] = sum(1, i)原创 2014-03-22 20:07:47 · 1248 阅读 · 0 评论 -
ZOJ 1183 Scheduling Lectures(DP)
题意:有一门课,有N个主题需要被这门课覆盖,每个主题ti有一个上课所需时间,第i+1个主题必须在第i个主题被覆盖后才能被覆盖,并且每个主题必须在一节课内被上完,每节课有一个不高兴值,不高兴值的计算已经给出了公式.给出一节课的长度,求最少需要多少节课,能够覆盖所有主题,如果存在多种方案都能满足最少节数,求出所有的不高兴值的和最少的那个不高兴值和.思路:因为题目给出了主题递增的覆盖条件,所有首原创 2014-04-02 12:55:05 · 932 阅读 · 0 评论 -
ZOJ 1563 Pearls(DP)
题意:有不同质量的珍珠,且质量高的珍珠价钱比质量低的珍珠价钱高。买一类珍珠的价钱计算方式:(购买数量+10)×单价质量低的珍珠可以用质量高的珍珠替代.要求给出一列表要买的珍珠类型和数量,求买完所有珍珠所要的最低价钱.那么可以得到:要么在第i类里买完所有质量i要买的的珍珠,要么在i后面的类里面买,因为如果一部分在第i类里买,一部分在其他类里买,由于价格是递增的,那么价原创 2014-03-27 21:08:54 · 457 阅读 · 0 评论 -
vijos P1180 选课
题目地址:P1180 选课多叉的情况不好做,所以可以转换成二叉树.那么设dp[i][j]为以i为根节点的子树上选择j门课.dp[i][j] = max(dp[right][j], dp[left][k - 1] +dp[right][j - k] + credit[i] | 1因为转换成了二叉树,所以任何节点i的右节点是其多叉树上的兄弟节点,左节点才是多叉树的子树.所以dp[r原创 2014-03-29 21:07:33 · 1162 阅读 · 0 评论 -
POJ 1745 Divisibility
题意:给出N数字,在N个数字中放入N - 1个+,-号,判断是否存在一种放置方案,使得结果能整除K,设dp[i][j]为前i个数字除K的余数j是否存在,那么答案就是dp[N][0]是否为true.因为(a + b) % c == (a % c + b % c ) % c, (a - b) % c == (a % c - b % c) % c那么dp[i + 1][(j + val[原创 2014-03-30 12:58:57 · 817 阅读 · 0 评论 -
HDU 2151 Worm
题目是中文,题意就不啰嗦了.设dp[i][j] 为第i分钟后到达第j颗树的方案数.dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1] 满足j - 1>= 0 && j + 1 初始化为dp为-1base case: dp[0][P] = 1#include #include using namespace std;const in原创 2014-03-19 09:04:48 · 470 阅读 · 0 评论 -
TYVJ P1047 - 乘积最大(DP)
题意:给出一个数字串,把它划分成K + 1份,使其乘积最大.类似矩阵连乘的DP 设dp[i][j][p]为区间[i, j]划分成p份的最大乘积.那么dp[i][j][p] = max(dp[i][k][p - 1] * val[k + 1][j]) val[i][j]为数字串i到j的值.base case: dp[i][j][1] = val[i][j]#include #inc原创 2014-03-29 18:54:08 · 885 阅读 · 0 评论 -
TYVJ P1203 - 机器分配
题目地址:TYVJ P1203 - 机器分配简单DP 设dp[i][j]为前i个公司分配j个机器能得到的最大利益dp[i][j] = max{prof[i][k] + dp[i - 1][j - k] | 0#include #include #include using namespace std;const int MAX = 101;int dp[MAX][MAX原创 2014-03-29 12:45:47 · 883 阅读 · 0 评论 -
UVA 10453 Make Palindrome(区间简单DP)
题意:给出一串字符串,求出需要至少插入多少个字符使得这个字符串变成会问粗原创 2014-05-01 10:42:26 · 522 阅读 · 0 评论 -
ZOJ 2278 Fight for Food(LIS)
题意:给出主人公的初始位置,老鼠的出现位置和时间,主人公每一个单位时间只能向邻近的格子走一步,如果走到某个格子上的时候老鼠正好出现在那个位置,那么就可以抓住它,求主人公最多能抓到多少老鼠.看起来三维的结构,其实只需要时间这一维就够了,因为两个格子的最短距离必然是曼哈顿距离,距离的计算可以是常数的,那么就相当于转换成了类似LIS的问题了.预处理的时候可以把每个点到其他所有点的所需时间都找出来原创 2014-04-01 17:14:17 · 1299 阅读 · 0 评论 -
POJ 1093 Formatting Text(DP)
题意:给出一段文章,要求将里面的单词按照n个字符一行来分,不够一行的可以在单词间插入空格来得到,一行有一个basness值,为一个每个gap之间的空格数-1的平方,求badness总和最少的分隔方式.经典DP,设dp[i]为从第i开始到第n单词的最少badness和分隔方式,那么dp[i] = min(dp[j + 1] + badness(i, j)).badness函数计算第i个单词到第j原创 2014-04-05 18:35:23 · 942 阅读 · 0 评论 -
vijos 1071 新年趣事之打牌
01背包问题,要求能否填满整个背包,由于要求出那几张牌丢失,所以不能使用滚动数组..这种情况下把dp[0][0]置0,其他的置为无穷小,再进行普通的01背包.如果dp[N][TotalW] != TotalW那么说明没有解.再判断是否dp[i][TotalW- W[i]] + W[i] == TotalW,如果是那么就可以通过第i张牌和前面i - 1张牌中的某几张牌组成totalW,如原创 2014-03-25 18:19:36 · 724 阅读 · 0 评论 -
UVA 11552 Fewest Flops(DP)
题意:输入一个正整数k和字符串S,字符串的长度保证为k的倍数。把S的字符按照从左到右的顺序每k个分成一组,每组之间可以任意排序,但组与组之间的先后顺序应保持不变。你的任务是让重排后的字符串包含尽量少的“块”,其中每个块为连续的相同字母比如,uuvuwwuv可以分成俩组:uuvu和wwuv,第一组可重排为uuuv,第二组可重排为vuww,连起来是uuuvvuww,包含4个块。思路:这原创 2014-04-18 10:49:38 · 869 阅读 · 0 评论 -
ZOJ 1524 Supermarket
题意:给出一张要买的东西列表,一排货架,要求在列表上从上到下,在货架上从左到右的选购东西,如果列表上第i件物品在第j个货架上买了,那么第i+1个物品,必须在第j个货架后面买.求买完所有东西需要的最少价钱.设dp[i][j]为前i件物品在前j个货架上买需要的最少价钱.那么有dp[i][j] = min(dp[i - 1][j - 1] + price[j], dp[i][j - 1]).原创 2014-03-27 12:25:34 · 956 阅读 · 0 评论 -
POJ 1179 Polygon(环形DP 矩阵连乘)
题意:给出一个环 环上的每个点有一个值 点和点之间用一条边相连,边上有一个运算符,要求删除一条边,然后对剩下的线两两顶点合并运算.求通过运算能得到的最大值.并求出删除某条边后能经过运算得到这个最大值的这些边.由于N要注意的是最大值可能有最小值相乘得到(负数),所以也要记录最小值.设dp1[i][j]为从i到j的最大运算结果,dp2为最小值那么dp1[i][j] = max(dp原创 2014-03-23 10:40:53 · 958 阅读 · 0 评论 -
ZOJ 2771 Get Out of the Glass(DP)
题意:有一道光射入3层玻璃,光可以在任何两层玻璃之间反弹,求反弹N次有多少种不同的路径.思路:一块玻璃有正反面之分,如果光射在(或者反弹到)第i层的正面,那么只能是从第1至第i-1层的反面反射到第i面的正面上,同样第i层的反面只能是从第i+1到最后一层的正面上反射到第i层的反面上.设dp[i][j][2]表示第i次反射在第j层的正反面的路径数,那么答案就是sum(dp[n][i][0] +原创 2014-04-08 22:24:02 · 1283 阅读 · 0 评论 -
ZOJ 2136 Longest Ordered Subsequence(LIS)
#include #include #include using namespace std;const int maxn=1010;int a[maxn],b[maxn],dp[maxn],n;int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;++i){ s原创 2013-04-23 11:00:30 · 517 阅读 · 0 评论 -
ZOJ 3741 Eternal Reality
题意:要参加一个比赛,要想赢一场比赛,自身等级必须大于等于对手的等级,初始等级为L,比赛场数N.主人公可以吃药,吃了药之后等级临时变成L + 1持续X场,X场之后会变成0级并且持续Y场后又变回初始等级L.求最多能赢多少场.设dp[i][0]为在第i场吃药到最后最多能赢多少场,dp[i][1]为在第i场不吃药到最后最多能赢多少场.1)dp[i][0] = [i, X + Y - 1]的赢得场原创 2014-03-26 21:24:41 · 1106 阅读 · 2 评论 -
ZOJ 3769 Diablo III(DP)
题意:给出13类装备,每种装备都有攻击力和防御值,每种装备只允许选择一个,求满足防御值至少在M的情况下,攻击力最大为多少.有几个条件:13种装备里如果选择了双手装备,就不能选择武器和护盾了,还有戒指可以双手各带一个.思路:首先不考虑条件,设dp[i][j]为前i种装备,防御值达到j的时候的最大攻击力.那么可以有dp[i][j + t] = max(dp[i][j + t], dp[i原创 2014-04-08 21:00:52 · 1300 阅读 · 0 评论 -
ZOJ 2846 Traverl(DP)
直接枚举每个城市作为起点,然后模拟是否能回到这个起点就可以了.原创 2014-04-09 20:51:54 · 740 阅读 · 0 评论 -
UVA 1351 String Compression(区间DP)
题意:给出一个字符串S,要求把字符串长度压缩的尽量短,如果有N个连续的字符串s相同,那么就可以把这多个字符串压缩成N(s),这样压缩后的长度为 N的位数+2(两个括号)+s的长度, 同样压缩后的N(s)还可以继续被压缩,求最短的字符串长度.思路:首先找出各个区间的最短周期串长度(即这个区间一个串循环多次组成),定义一个cycle[i][j]表示[i,j]区间的最短周期串长度.然后进行动态规原创 2014-04-25 16:30:21 · 720 阅读 · 0 评论 -
ZOJ 1953 Advanced Fruits(LCS)
题意:给出两个字符串,求能满足子串(可以不连续)中包含给出的两个字符串的最短字符串.思路:本质上就是LCS问题,做法是先找出两个串的LCS,并记录其位置设dp[i][j]为A串以第i个字符结尾B串以第j个字符结尾的LCS, 用path数组来记录路径,如果A[i] == B[j] 那么dp[i][j] = dp[i - 1][j - 1].否则 dp[i][j] = max(dp[i原创 2014-04-07 21:41:28 · 828 阅读 · 0 评论 -
Codeforces 414b Mashmokh and ACM(简单DP)
题意:一个序列B1,B2...Bl如果是好的,必须满足Bi | Bi + 1(a | b 代表a整除b), 求长度为K,元素大小小于N的序列个数.思路:看到数据的规模和取模1000000007就知道应该是数位DP了,设dp[i][j]表示以i做结尾长度为j的序列个数.那么答案就是sum(dp[i][K] | 1dp[i][j] = sum(dp[p][j - 1] | p满足p能整除i原创 2014-04-07 11:12:02 · 1387 阅读 · 0 评论 -
POJ 2948 Martian Mining(DP)
题意:(摘自刘汝佳的训练指南)给出n*m网格中每个格子的A矿和B矿的数量,A矿必须由右向左运输,B矿必须由下向上运输,管子不能拐弯或间断(即往上和往左的路线不能有交集)。要求使收集到的A,B矿总量尽量大。思路:考虑到管子不能转弯和间断,可以设dp[i][j]为以i,j为左下角的最大矿总量.开两个辅助数组A[i][j]为在i,j位置的时候建A管子的时候从i,j到i, 1的总和, B[i][j原创 2014-04-21 09:44:31 · 917 阅读 · 0 评论 -
UVA 11795 Mega Man's Mission(状态压缩DP)
题意:需要打败N个敌人,初始给出了一个武器,武器能打败一些敌人,打败一个敌人之后就能得到敌人的武器,其武器又可以大原创 2014-04-20 12:56:06 · 731 阅读 · 0 评论 -
ZOJ 1134 Strategic Game(树形DP)
dp[i][0]表示i结点放士兵的最优值,dp[i][1]表示i结点不放士兵的最优值因为是一棵树,所以状态转移方程:1.dp[i][0]+=min(dp[v][0],dp[v][1])表示i结点放士兵的最优值累加上v结点放士兵的最优值和v结点不放士兵的最优值.2.dp[i][1]+=dp[v][0] 很自然的就是i结点不放士兵的最优值累加上v结点放士兵的最优值,因为要覆盖每一条边,所以原创 2013-04-28 21:54:18 · 638 阅读 · 0 评论 -
ZOJ 2852 Deck of Cards(DP)
题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1852题意太繁琐就不讲了.设dp[q][i][j][k]表示前i张牌,每个卡槽的分值各为i,j,k时候的最能的多金钱数.dp[0][0][0][0]=0,其他设为-1.具体的转移方程看程序吧.#include #include #include原创 2014-04-06 19:34:24 · 1498 阅读 · 0 评论 -
UVA 1456 Cellular Network(贪心,DP)
题意:(摘自LRJ《训练指南》)手机在蜂窝网络中的定位是一个基本问题。假设蜂窝网络已经得知手机处于c1, c2,…,cn这些区域中的一个,最简单的方法是同时在这些区域中寻找手机。但这样做很浪费带宽。由于蜂窝网络中可以得知手机在这不同区域中的概率,因此一个折中的方法就是把这些区域分成w组,然后依次访问。比如,已知手机可能位于5个区域中,概率分别为0.3、0.05、0.1、0.3和0.25原创 2014-04-18 16:37:30 · 725 阅读 · 0 评论 -
ZOJ 2972 Hurdles of 110m(DP)
题意:刘翔跨栏问题,初始有M能量,有N块区域需要跑,在第i可以使用3种模式:1.Fast模式 通过第i个区域需要用T1[i]的时间,需要消耗F1[i]能量.2.Normal模式 通过第i个区域需要用T2[i]的时间,不需要消耗能量.3.Slow模式 通过第i个屈戌需要T3[i]的时间,能增加F2[i]能量,但是增加后的能量不能超过总能量M.求通过N个区域的最短时间.还是比较简单原创 2014-04-06 16:46:26 · 768 阅读 · 0 评论 -
九度OJ 1537 买卖股票(DP)
题意:给出N天的股价,能买入和卖出股票,但是任何时候手上最多持有一份股票.允许交易K次求最多的收益.思路:设dp[i][j]为前i天交易j次的最大收益.那么dp[i][j] = max(dp[k][j - 1] - a[k + 1] + a[i], dp[i - 1][j]) 0这样的复杂度为O(KN^2),注意到在求dp[i][j]的时候dp[k][j - 1]都已经计算好了,所以可原创 2014-04-06 22:38:09 · 1373 阅读 · 0 评论 -
Codeforces 392B Tower of Hanoi(DP)
题意:在原来的汉诺塔基础上,给每次移动加上一个权值,Tij表示从rodi移动到rodj的花费.求把n个盘子从rod1移动到rod3上的最少花费.设dp[n][i][j]为将n个盘子从rodi移动到rodj上的最少花费.决策有两个.1.将rod1上的n-1个盘子移动到rod2上,将rod1上的最后一个移动到rod3上,再将rod2上的n-1个盘子移动到rod3上.2.将rod1上原创 2014-04-06 20:59:05 · 984 阅读 · 0 评论