
--------【动态规划】
文章平均质量分 71
liuyanfeier
acmer
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Hdu 1429(状态压缩)
有钥匙和门的 bfs + 状态压缩 一个十把钥匙和锁,分别为a,b......j。当所用的步数小于t即可。和上一篇对应着来看,加强状态压缩的理解。#include#include#include#includeusing namespace std;int n,m,t,ans;char map[21][21];int dir[4][2]={1,0,-1原创 2015-09-11 21:10:10 · 411 阅读 · 0 评论 -
计数dp hdu 4055 Number String
嗯,什么是计数dp我也不知道,这是第一次遇见类似的题目。题意:给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于。问1~n的排列中有多少个满足该字符串。分析:看题意就觉得像是dp,果然是的。dp[i][j]表示的是前i个数字的排列中以数字j结尾的排列个数。那么递推关系是什么呢。当str原创 2016-01-03 20:20:58 · 447 阅读 · 0 评论 -
dp Codeforces 429B B. Working out
B. Working outtime limit per test 2 secondsmemory limit per test 256 megabytesinput standard inputoutput standard outputSummer is coming! It's time for Iahub an原创 2016-01-19 17:10:35 · 522 阅读 · 0 评论 -
dp递推 zoj 3747 Attack on Titans
题意:给n个士兵排队,每个士兵三种G、R、P可选,求至少有m个连续G士兵,最多有k个连续R士兵的排列的种数。分析:不是很好想的一道题。但是想通之后也是可以很好理解的。我们试着将一个至多一个至少都变成至多的情况,至多K个连续的R,至少M个连续的G,这时我们可以看成是至多n个连续的G减去至多m-1个G,那剩下的情况不就是至少M个连续G的情况了吗。dp[i][0] 表示的原创 2016-01-19 21:13:16 · 514 阅读 · 0 评论 -
hdu5375 dp+递推
题意:给出一段二进制码,其中有些位置的数字不确定用"?"表示,这些位置可以为0也可以为1,然后将这个数字的所有可能转化为相应的格雷码,格雷码对应的数字串中位置为i的数字是1的话就可以得到a[i],问最终所有的格雷码中能得到的最大数字和是多少。分析:首先我们要知道怎样由二进制求得格雷码,由二进制转化为格雷码的公式为将二进制右移一位然后与原来的二进制码按位异或。这样我们就可以用dp的方原创 2016-01-20 20:15:40 · 464 阅读 · 0 评论 -
hdu4489 dp+递推
题意:有n个高矮不同的士兵,现在要将他们按高,矮依次排列,问有多少种情况。分析:组合dp问题。假设n个士兵的身高分别为1,2......n。我们现在考虑n个士兵的情况,最后一个身高为n的最高的士兵应该站在哪里呢。我们可以看到前面有n-1个士兵,一共有n个位置可以站,但是我们注意到要按高矮的顺序排列。因为n的身高最高,所以他插入的位置前面一个人应该是按照下降得到的,后面一个人应该原创 2016-01-20 16:54:41 · 600 阅读 · 0 评论 -
hdu5286 dp+递推
题意:有n个人,每个人有一个value值,有两扇门A,B分别各有一个value,现在要讲n个人分为两组分别从两个门进入,要求是每组人的value值的和(迭代的求,直至变为一位数字)等于该门的value值,问一共有多少种进入的方法。分析:首先我们可以发现,假如能够进去的话,那么所有的人的value值的和刚好等于两扇门的value值的和。或者只进入一个门,也就是只等于一个门的value值。原创 2016-01-21 13:51:49 · 498 阅读 · 0 评论 -
51nod1202 dp+递推
题意:子序列的定义:对于一个序列a=a[1],a[2],......a[n]。则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1例如4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。对于给出序列a,有些子序列可能是相同的,这里只算做1个,请输出a的不同子序列的数量。由于答案比较大,输出Mod 10^9 + 7的结果即可。分析原创 2016-01-21 15:44:39 · 317 阅读 · 0 评论 -
51nod 1270 递推+dp
题意:数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 (公式表示所有两个相邻元素的差的绝对值之和)给出数组B,计算可能的最大代价S。分析:这题首先我们要想到,要保证s最大,那么数组A的数字要么等于1,要么等于数组B。这应该是直觉。但是我们想到,原创 2016-01-24 15:18:49 · 450 阅读 · 0 评论 -
51nod 1154回文串划分 dp+递推
题意:有一个字符串S,求S最少可以被划分为多少个回文串。例如:abbaabaa,有多种划分方式。a|bb|aabaa - 3 个回文串a|bb|a|aba|a - 5 个回文串a|b|b|a|a|b|a|a - 8 个回文串其中第1种划分方式的划分数量最少。分析:刚开始以为类似abab这样的字符串也是回文的,卡了好久,原创 2016-01-24 20:07:18 · 1160 阅读 · 0 评论 -
51nod 1086 多重背包模板
有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。#include #include #include #include #includeusing namespace std;const原创 2016-01-24 20:09:48 · 368 阅读 · 0 评论 -
51nod 1085 01背包模板
在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。#include #include #include #include #includeusing namespace std;int const maxn = 10005;int w[maxn],c[原创 2016-01-24 20:11:19 · 568 阅读 · 0 评论 -
51nod 1201 递推+dp
题意:将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种。由于数据较大,输出Mod 10^9 + 7的结果即可。分析:dp[i][j]表示的是将数字i分成j个不同的数字的划分方法。这样我们就可以知道,数字n最多的划分数量是1+2+3+......+m 递推公式为:dp[i][j] = dp[i-j原创 2016-01-24 20:40:45 · 363 阅读 · 0 评论 -
大楼扔鸡蛋问题 dp poj 3783
题意分析: 经典题,小白书上的一道例题,4+2出了这道原题,我愣是以为是数学题,最后也没做出来。题意是这样的,给你N个鸡蛋(硬度一样),让你测鸡蛋的硬度,测量的方法就是从某栋M层的楼的某一层X上把鸡蛋扔下来,如果鸡蛋碎了,代表他的强度小于X;如果没碎,则强度大于等于X。我们要做的就是不断的从楼上把鸡蛋扔下来,直到找到某一层楼X,从这一层楼扔下来鸡蛋不碎掉,从X+1层扔下来鸡蛋碎掉,那么鸡蛋的强度就原创 2015-12-20 19:40:33 · 1912 阅读 · 0 评论 -
poj 1141 (区间dp记录路径问题)
题意:括号匹配问题。问需要插入多少个括号是的所有的括号都正好可以匹配。输出其中长度最短的一个。分析:dp[i][j] 表示的是在区间(i,j)之间添加的最少的括号数,c[i][j] 记录断开的位置,没有断开的话记为-1。dp[i][i] = 1;当s[i]=='(' && s[j]==')' 或者 s[i]=='[' && s[j]==']'时,d[i][j]=d[i+1][j原创 2015-12-16 20:23:34 · 448 阅读 · 0 评论 -
POJ 2955 区间dp
题意:求括号匹配的最大长度思路:简单区间dp,令dp[i][j] 为 区间(i,j)之间的最大匹配长度。这样dp[i][j] = max( dp[i][j] , dp[i][x] + dp[x+1][j] ) i不过dp[i][j] 得先初始化,为dp[i+1][j-1] 或者 dp[i+1][j-1] +2 ;#include #include #includ原创 2015-12-16 17:06:36 · 382 阅读 · 0 评论 -
hdu 5569 DP
题意:有一个n行m列的矩阵,其中n+m为奇数。现在从(1,1)到(n,m)一共要走2×k步,分别为a1,a2......a2×k。总的代价为a1×a2+a3×a4+......+a(2*k-1)*a(2*k);求所有可能的路径中,代价最小的,输出代价思路和过程见代码注释。#include #include #include #include #include原创 2015-11-30 17:30:57 · 345 阅读 · 0 评论 -
POJ1163DP
题意和解析,看代码最后部分#include #include #include using namespace std;int main(){ int t,n; int dp[105][105]; int a[105][105]; //scanf("%d",&t); while(scanf("%d",&n)!=EOF) {原创 2015-11-30 22:08:46 · 342 阅读 · 0 评论 -
dpPOJ 2027 LCIS(最长上升公共子序列)
题意和解析见代码最后部分#include#include #include #include using namespace std;int a[505],b[505];int dp[505][505];int n,m;int path[505][505];int I,J,ans,res[505];int main(){ while(scanf("%d原创 2015-12-01 20:17:10 · 569 阅读 · 0 评论 -
DP+(POJ1458) 最长公共子序列
题意:给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。解析:看代码最后部分//最长公共子序列(POJ1458)#include #include #include #include #include using namespace std;int const max原创 2015-11-30 22:10:43 · 364 阅读 · 0 评论 -
最长上升子序列
问题描述一个数的序列ai,当a1我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).你的任务,就是对于给定的序列,求出最长上升子序列的长度。分析:看代码最后部分//最长上升子序列#include #include原创 2015-11-30 22:12:26 · 326 阅读 · 0 评论 -
dp 石子合并问题
石子合并问题:有n(N两堆价值之和,求最终将所有的石子合并成一堆之后的代价最小值。问题一:n堆石子排成一条直线这个问题比较简单,类似与矩阵连乘的问题。dp[n][m] 为合并n和m之间的石子的代价则有dp[i][j] = 0 , i==jdp[n][m] = min(dp[n][k]+dp[k+1][m]) + sum(n,m) n#include原创 2015-12-02 19:07:57 · 581 阅读 · 0 评论 -
DP 【POJ1160】POST OFFICE 邮局问题
题意:在一个坐标轴上有n个村庄,每个村庄有一个坐标a[i],现在要在这n个村庄之间建立m个邮局,求每个村庄到距离它最近的邮局的距离之和。其中n【题目分析】:经典DP1、考虑在V个村庄中只建立【一个】邮局的情况,显然可以知道,将邮局建立在中间的那个村庄即可。也就是在a到b间建立一个邮局,若使消耗最小,则应该将邮局建立在(a+b)/2这个村庄上(可以通过画图知道)。原创 2015-12-02 20:39:55 · 1423 阅读 · 0 评论 -
简单dp 最大连续子序列
//设n个元素的序列存储在数组A[1...n]中,求数组中连续子序列之和的最大值。#include #include #include #include #include using namespace std ;const int maxn = 100005 ;int n , ans ;int a[maxn] ;int dp[maxn] ;//dp[i] 前i个数字的原创 2015-12-02 21:31:09 · 535 阅读 · 0 评论 -
DP 数字三角形(POJ1163)
73 88 1 02 7 4 44 5 2 6 5在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。三角形的行数大于1小于等于100,数字为0 -99“人人为我”递推型动归程序a(i,j) : 第i行第j个数字(i,j从1开始算)dp(i,j) :原创 2015-12-06 13:57:32 · 561 阅读 · 0 评论 -
dp 最佳加法表达式
题意:有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少。分析:假定数字串长度是n,添完加号后,表达式的最后一个加号添加在第i 个数字后面,那么整个表达式的最小值,就等于在前i 个数字中插入m –1个加号所能形成的最小值,加上第i + 1到第n 个数字所组成的数的值(i从1开始算)。设V(m,n)表示在n个数原创 2015-12-06 16:03:26 · 2979 阅读 · 1 评论 -
POJ DP 百练1088 滑雪问题
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 1原创 2015-12-14 19:45:34 · 1758 阅读 · 1 评论 -
ZOJ 3537 区间dp
题意:给出一些点表示多边形蛋糕的定点的位置(如果蛋糕是凹多边形就不能切),切蛋糕时每次只能在顶点和顶点间切,每一次切蛋糕都有相应的代价,给出代价的公式,问把蛋糕切成多个三角形的最小代价是多少。由于有可能是凹多边形,所以得先判断凸性,直接求凸包,然后判断凸包顶点和所给点的大小,然后再解决最小代价。我们用dp[i][j]表示从i点到j点所构成的多边形的最优三角剖分,我们以j-i边为三角形的原创 2015-12-15 20:15:39 · 449 阅读 · 0 评论 -
51nod 1051 最大子矩阵和 dp
题意:一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。例如:3*3的矩阵:-1 3 -12 -1 3-3 1 2和最大的子矩阵是:3 -1-1 31 2分析:三重循环,类似于求解一维中的最大连续和一样的dp问题,只不过换成了二维而原创 2016-02-06 13:14:39 · 533 阅读 · 0 评论 -
hdu 1025 dp+二分 模板
题意:在一条河的两边各有n个位置,在这些位置之间建桥,要求所有桥之间不能交叉。现在告诉你所有可以建桥的位置,例如2,4,就是说河左边的位置2可以与河右边的位置4之间建桥,现在要求满足要求的情况下最多可以建桥的个数。分析:想了好久发现是一个最长上升子序列问题,当时n比较大,所以一般的dp算法不能解决这个问题,所以我们换一种专门解决这个问题的特殊解法,就是用dp+二分,但是只能解决序列的长原创 2016-02-14 13:46:03 · 422 阅读 · 0 评论 -
hdu3555 + 2089 (数位dp入门)
hdu3555给出数字n,要求1到n范围内所有的数字中出现连续49的数字的个数。n很大。例如500,那么出现连续49的数字有49,149,249,349,449,490,491,942...499等15个数字。这道题目就是明显的数位dp入门题目。我们先预处理一下,dp[i][j]表示的是i位数字并且第i位上的数字为j所不含49的个数#include #include原创 2016-03-02 20:00:36 · 860 阅读 · 0 评论 -
hdu 1158(dp)
题意:一项工程需要n个月完成,每个月最少需要的员工数为a[i],雇佣一个员工和开除一个员工的费用为hire与fire,每个员工每个月的工资为salary,现在要求完成这项工程最少的花费。n分析:由于这道题目没有告诉我们a[i]的范围,所以我想了很久迟迟没有动手,因为想到一个方法的时间复杂度为max(a[i])^2*n , 实在是不知道怎么办了就用这种方法写了,WA了几次就过了,原创 2016-03-02 21:29:42 · 377 阅读 · 0 评论 -
hdu1159 最长公共子序列
简单题,要求两个字符串的最长公共子序列。dp[i][j]表示的是第一个字符串的前i个子串和第二个字符串的前j个子串的最长公共子序列 。//最长公共子序列#include #include #include #include #include using namespace std;const int maxn = 1005;int dp[maxn][maxn];//原创 2016-03-03 16:13:20 · 362 阅读 · 0 评论 -
hdu1160 最大上升子序列问题+输出路径
题意:就是在一个序列里面找出最长的子序列,这个序列中体积上升,速度下降。分析:就是按体积排序之后素的的找出最大下降子序列就可以了,麻烦一点的就是需要输出顺序。#include #include #include #include #include #includeusing namespace std;const int maxn = 1005;struct原创 2016-03-03 18:31:01 · 389 阅读 · 0 评论 -
整数划分 区间dp
题目链接点击打开链接题目大意是说有一个不超过二十位的数字,要将这个数字划分成n段,最后让这n段数字相乘,问怎么划分使乘积最大。分析:一个很经典的区间dp问题,我们可以先保存下这个数字的每段的大小,也就是a[i][j]表示的这个数字的i位到j位的大小。然后就是一个很普通的区间dp了,dp[i][j]表示的是前i位里面插入j个乘号所得到的最大值。我们知道最后的乘积肯原创 2016-03-04 13:27:27 · 633 阅读 · 0 评论 -
poj2096 概率dp入门
题意:一个系统有s个子系统,一共会产生n中bug。某人一天可以发现一个bug,这个bug属于一个子系统,属于一个种类,每个bug属于某个子系统的概率是1/s,属于某个分类的概率是1/n,问发现n种bug并且每个子系统都发现bug的天数的期望。分析:简单的入门概率dp,在这之前没有做个这个类型,所以讲解也是看的网上的,这里直接贴过来。 dp[i][j]表示已经找到i种bu原创 2016-03-04 15:52:30 · 486 阅读 · 0 评论 -
hdu 3853 概率dp入门
题意:在一块r*c的棋盘上,从位置(1,1)的地方走到位置为(r,c)的地方,每走一步的代价为2,在位置(i,j)可能会走到位置(i+1,j),(i,j+1)以及(i,j),题目中给出每个点走向下一个方向的概率,求花的总代价。分析:一道很基础的概率dp,dp[i][j]表示的是从位置(i,j)走到(r,c)所花的代价,那么dp[r][c] = 0 , 最后要求的就是dp[1][原创 2016-03-04 17:55:10 · 410 阅读 · 0 评论 -
hdu 4586 概率dp
题意:扔一个有n面的骰子,可能得到正面朝上的那个面上面的数字,有一些面比较特殊,扔到这些面上之后可能继续扔,问最终能等到的数字和的期望。分析:这道题目严格意义上已经不是dp了,就是一道概率分析题目。我们假设最终的期望为ans,那么我们可以一个面一个面的分析,假设正面朝上的不是一个特殊的面,那么ans += 1/n * a[i] ; 假设是一个特殊的面朝上,那么 ans +原创 2016-03-04 19:35:14 · 332 阅读 · 0 评论 -
poj2342 树形dp入门
题意:公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系,求邀请哪些人来能使得晚会的总活跃指数最大。分析:毫无疑问肯定需要先建树,然后就是从这棵树里面选择一些点,当然不能暴力。我们用dp[i][0]表示不选择第i棵树,他的子数所能取得的最大值,dp[i][1]表示选取第i棵树的最大值。然后我们原创 2016-03-05 16:00:08 · 412 阅读 · 0 评论 -
hdu1203 01背包问题
Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了。要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的。Speakless没有多少钱,总共只攒了n万美元。他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每个学校都有不同的申请费用a(万美元),并且Speakless估计了他得到这个学校offer的可能性b。不同学校之原创 2016-03-09 19:43:50 · 393 阅读 · 0 评论