----------------【基础dp】
文章平均质量分 70
liuyanfeier
acmer
展开
-
hdu 1165 递推
题目:As is known, Ackermann function plays an important role in the sphere of theoretical computer science. However, in the other hand, the dramatic fast increasing pace of the function caused the val原创 2016-03-15 17:28:39 · 366 阅读 · 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 · 294 阅读 · 0 评论 -
hdu5286 dp+递推
题意:有n个人,每个人有一个value值,有两扇门A,B分别各有一个value,现在要讲n个人分为两组分别从两个门进入,要求是每组人的value值的和(迭代的求,直至变为一位数字)等于该门的value值,问一共有多少种进入的方法。分析:首先我们可以发现,假如能够进去的话,那么所有的人的value值的和刚好等于两扇门的value值的和。或者只进入一个门,也就是只等于一个门的value值。原创 2016-01-21 13:51:49 · 467 阅读 · 0 评论 -
hdu4489 dp+递推
题意:有n个高矮不同的士兵,现在要将他们按高,矮依次排列,问有多少种情况。分析:组合dp问题。假设n个士兵的身高分别为1,2......n。我们现在考虑n个士兵的情况,最后一个身高为n的最高的士兵应该站在哪里呢。我们可以看到前面有n-1个士兵,一共有n个位置可以站,但是我们注意到要按高矮的顺序排列。因为n的身高最高,所以他插入的位置前面一个人应该是按照下降得到的,后面一个人应该原创 2016-01-20 16:54:41 · 563 阅读 · 0 评论 -
hdu5375 dp+递推
题意:给出一段二进制码,其中有些位置的数字不确定用"?"表示,这些位置可以为0也可以为1,然后将这个数字的所有可能转化为相应的格雷码,格雷码对应的数字串中位置为i的数字是1的话就可以得到a[i],问最终所有的格雷码中能得到的最大数字和是多少。分析:首先我们要知道怎样由二进制求得格雷码,由二进制转化为格雷码的公式为将二进制右移一位然后与原来的二进制码按位异或。这样我们就可以用dp的方原创 2016-01-20 20:15:40 · 436 阅读 · 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 · 483 阅读 · 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 · 488 阅读 · 0 评论 -
大楼扔鸡蛋问题 dp poj 3783
题意分析: 经典题,小白书上的一道例题,4+2出了这道原题,我愣是以为是数学题,最后也没做出来。题意是这样的,给你N个鸡蛋(硬度一样),让你测鸡蛋的硬度,测量的方法就是从某栋M层的楼的某一层X上把鸡蛋扔下来,如果鸡蛋碎了,代表他的强度小于X;如果没碎,则强度大于等于X。我们要做的就是不断的从楼上把鸡蛋扔下来,直到找到某一层楼X,从这一层楼扔下来鸡蛋不碎掉,从X+1层扔下来鸡蛋碎掉,那么鸡蛋的强度就原创 2015-12-20 19:40:33 · 1868 阅读 · 0 评论 -
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 · 1702 阅读 · 1 评论 -
dp 最佳加法表达式
题意:有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少。分析:假定数字串长度是n,添完加号后,表达式的最后一个加号添加在第i 个数字后面,那么整个表达式的最小值,就等于在前i 个数字中插入m –1个加号所能形成的最小值,加上第i + 1到第n 个数字所组成的数的值(i从1开始算)。设V(m,n)表示在n个数原创 2015-12-06 16:03:26 · 2781 阅读 · 1 评论 -
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 · 525 阅读 · 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 · 496 阅读 · 0 评论 -
DP 【POJ1160】POST OFFICE 邮局问题
题意:在一个坐标轴上有n个村庄,每个村庄有一个坐标a[i],现在要在这n个村庄之间建立m个邮局,求每个村庄到距离它最近的邮局的距离之和。其中n【题目分析】:经典DP1、考虑在V个村庄中只建立【一个】邮局的情况,显然可以知道,将邮局建立在中间的那个村庄即可。也就是在a到b间建立一个邮局,若使消耗最小,则应该将邮局建立在(a+b)/2这个村庄上(可以通过画图知道)。原创 2015-12-02 20:39:55 · 1368 阅读 · 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 · 529 阅读 · 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 · 289 阅读 · 0 评论 -
DP+(POJ1458) 最长公共子序列
题意:给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。解析:看代码最后部分//最长公共子序列(POJ1458)#include #include #include #include #include using namespace std;int const max原创 2015-11-30 22:10:43 · 338 阅读 · 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 · 539 阅读 · 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 · 296 阅读 · 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 · 424 阅读 · 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 · 1126 阅读 · 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 · 335 阅读 · 0 评论 -
51nod 1043
题意:求在2*n位的数字中,前n位的和等于后n位的和的个数,比喻n=1的时候,11,22,33...99等数字都是的,还有1102,2121等都是满足要求的数字。n分析:数位dp题目,这道题目想了很久,刚开始以为是dp[i][j] 表示的是前 i 位数字和后 i 位数字的差为 j ,是这样的。结果递推方程想了很久也没有一个统一的结果,需要一个一个的来推,倒是大概好像有一个统一的想法,原创 2016-03-12 21:14:14 · 599 阅读 · 0 评论 -
hdu1160 最大上升子序列问题+输出路径
题意:就是在一个序列里面找出最长的子序列,这个序列中体积上升,速度下降。分析:就是按体积排序之后素的的找出最大下降子序列就可以了,麻烦一点的就是需要输出顺序。#include #include #include #include #include #includeusing namespace std;const int maxn = 1005;struct原创 2016-03-03 18:31:01 · 359 阅读 · 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 · 333 阅读 · 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 · 340 阅读 · 0 评论 -
hdu 2089(dp)
题意:给出一个区间,求这个区间里面的数字一共有多少个数字其中不含数字4并且没有连续的62 。例如,4,14,412,162等等数字就不满足要求。分析:网上都说这题是数位dp,好像是的。可是我还没有入门数位dp,就是用的普通的dp来写的。dp[i]表示的是在区间(1,i)之间满足要求的数字的个数,递推公式为:dp[i] = dp[i-1]+0/1 .#incl原创 2016-03-01 19:58:49 · 267 阅读 · 0 评论 -
51nod 1002数塔取数 dp
一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。 5 8 4 3 6 97 2 9 5例子中的最优方案是:5 + 8 + 6 + 9 = 28一道比较简单的dp问题。dp[i][j]表示的是原创 2016-02-29 14:58:47 · 393 阅读 · 1 评论 -
51nod 1021石子归并 dp
N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价。例如: 1 2 3 4,有不少合并方法1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19)1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24)原创 2016-02-29 14:37:37 · 379 阅读 · 0 评论 -
51nod 1050 循环数组最大子段和 dp
N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。当要求不循环的时候问题原创 2016-02-28 19:58:15 · 578 阅读 · 0 评论 -
51nod 1055最长等差数列 dp
N个不同的正整数,找出由这些数组成的最长的等差数列。例如:1 3 5 6 8 9 10 12 13 14等差子数列包括(仅包括两项的不列举)1 3 51 5 9 133 6 9 123 8 135 9 136 8 10 12 14其中6 8 10 12 14最长,长度为5。因为没看清题目意思纠结原创 2016-02-28 16:55:33 · 2303 阅读 · 0 评论 -
51nod 1084+1083 矩阵取数问题 dp
先来说这个比较简单的问题:一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。例如:3 * 3的方格。1 3 32 1 32 2 1能够获得的最大价值为:11。经典并且简单的问题,dp[i][j]表示的是从位置(1,1)到位置(n,n)的最原创 2016-02-28 14:54:54 · 1327 阅读 · 0 评论 -
51nod 1092 回文字符串 dp问题
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。每个字符串都可以通过向中间添加一些字符,使之变为回文字符串。例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba。方案1只需要添加2个字符,是所有方案中添加字符数量最少的。分析:该题目有两种不同的思路,想到了就非常简单。解法一:这种解法相对原创 2016-02-27 20:18:44 · 531 阅读 · 0 评论 -
51nod 1183编辑距离 经典dp
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:sitten (k->s)sittin (e->i)sitting (->g)所以kitten和sittin原创 2016-02-27 16:38:59 · 625 阅读 · 0 评论 -
hdu 1421 搬寝室,dp
题意:在n个物品里面选取k对物品,使这k对物品的平方差之和最小。分析:一道典型的dp题目。dp[i][j]表示的是在前i个物品里面选取j对的品方差之和,其中i大于等于j*2我们对,物品排序之和会发现,由于是平方差之和,那么一个数字一般只会和他前面的一个数字或者后面的数字组合。这样我们来想递推方程的时候会简单很多的。dp[i][j] 有两种方式可以得到,一种是这j对物品原创 2016-02-17 17:16:38 · 394 阅读 · 0 评论 -
hdu1466 dp+直线交点问题
题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。分析:题目意思很简单,但是思路不好想呀。这个dp不是通过i条直线递推i+1条直线。结论是:假若有k条直线可以有j个相交点,那么i条直线一定可以有(i-k)*k+j个交点。因为i条直线可以分为i-k条平行线以及k条自由线原创 2016-02-15 17:32:34 · 345 阅读 · 0 评论 -
hdu1176 dp
免费馅饼问题。分析:一道比较简单的dp问题,只要想到用dp[i][j]去表示第i秒走到位置j所得到的最多馅饼数,这道题目也就解决了。状态转移方程是:dp[i][j] += max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));从最后一秒反向递推比较方便。具体见代码://1176#include #include #inclu原创 2016-02-15 15:55:08 · 238 阅读 · 0 评论 -
hdu 1025 dp+二分 模板
题意:在一条河的两边各有n个位置,在这些位置之间建桥,要求所有桥之间不能交叉。现在告诉你所有可以建桥的位置,例如2,4,就是说河左边的位置2可以与河右边的位置4之间建桥,现在要求满足要求的情况下最多可以建桥的个数。分析:想了好久发现是一个最长上升子序列问题,当时n比较大,所以一般的dp算法不能解决这个问题,所以我们换一种专门解决这个问题的特殊解法,就是用dp+二分,但是只能解决序列的长原创 2016-02-14 13:46:03 · 394 阅读 · 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 · 499 阅读 · 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 · 316 阅读 · 0 评论