dp
文章平均质量分 50
cyl纤云弄巧
To Be
展开
-
POJ 3176 (简单dp)
http://poj.org/problem?id=3176题意:输入n层数字三角形,求从第一层到最后一层最大权值和。其实用递归很简单的解决,但是数据范围是350层,递归确实可以解决,但是会超时。很容易看出来,maxn(i,j)是第i层第j数字到底层的最大权值和,所以要求maxn(i,j)有两种选择a(i,j)+MAX(maxn(i+1,j),maxn(i+1,j+原创 2016-08-18 09:15:30 · 468 阅读 · 0 评论 -
POJ 2479 (简单dp)
http://poj.org/problem?id=2479题意:给出一串数字,,它的意思是最大连续的子串和。解题思路很简单:左边遍历一次求left[i]最大的和,然后再从右遍历一次找出最大的d[A]就行了。需要注意的是:数组范围;存在负数;temp的使用。#include#include#define Min -9999999using na原创 2016-08-22 11:05:49 · 563 阅读 · 0 评论 -
POJ (简单 dp ,最长升序子串)
POJ 1533题意:求输入的一串数字的最长升序子串的长度。#include#include#include#define M 1005using namespace std;int s[M];int maxn[M];int main(){ int n; cin>>n; for(int i = 1;i <= n; i++)原创 2016-08-19 18:08:56 · 762 阅读 · 0 评论 -
POJ 1661(中等 dp,跳板游戏)
http://poj.org/problem?id=1661题意:不多讲,求从出发点到底的最短时间。思路:把从一个点到下一个板的问题看成两个雷同的问题,一切尽在代码解释中。#include#include#include#include#define M 1000#define inf 0x3f3f3f3fusing namespace std;int原创 2016-08-22 20:40:59 · 296 阅读 · 0 评论 -
POJ 1548 (最长公共子串)
http://poj.org/problem?id=1458题意:求出两个字符串的最长公共子串,子串可以不是连续的,思路:可以用一个二维数组保存s1[ i ] 和s2[ j ]之前的最长子串长度(包括s1[ i ] 和s2[ j ])。那么其实问题显而易见的分成了两种情况s1[ i ] 和s2[ j ]相等和不相等问题自然迎刃而解了。dp的思想,分成子问题来优化。原创 2016-08-23 09:41:57 · 347 阅读 · 0 评论 -
POJ 3616 (dp)
题意: 有m个时间段,在n时间内可以挤奶,挤一次之后休息r时间,问最多挤多少。思路:分段dp问题:这道题给出了一种分段dp的思想。dp[i]表示第i段时间所挤的奶。注意:最后的求最大,因为有可能最后一种s太大而遍历不到。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace原创 2016-12-10 11:26:30 · 235 阅读 · 0 评论 -
HDU1864(dp01背包)
汉语题。 思路一看就是经典的01背包问题,背或者不背呢?===注意的点:1. 字符处理 2.条件判断 3.精度与范围控制 4.经典背包计算相对来说第三点是不容易想到的,精度的控制这么巧妙,因为在用一维数组控制dp的时候i,j是int类型,也就是容量要求是int类型,题中是double类型,所以先扩大100倍,保留两位小数。#原创 2016-11-18 20:40:54 · 405 阅读 · 0 评论 -
POJ 3682 (dp)
题意:有n头牛和B高度的书架,牛叠罗汉,需要求出最少的牛的高度和超过或者等于B。很明显不能用二位的01dp有一个很好的思路,因为并不知到v[i],我们可以使w[i] == v[i],并且可以把容量大于B,也就是sum>B.这是必然的,不然也是没有意义。#include#include#includeusing namespace std;const int原创 2016-11-19 21:03:43 · 279 阅读 · 0 评论 -
1458(最长公共子串)
两个字符串比如:s1 = "abcd";s2 = "becd"; 那么公共子串最长是3;定义:dp[i+1][j+1] 表示s1[0]s[i]和s2[0]s2[j]的公共子串长度。思路:分成两种大方向 1.s1[i] == s2[j] 那么是dp[i+1][j+1] = dp[i][j] + 1; 2.ma原创 2016-11-19 21:29:38 · 277 阅读 · 0 评论 -
POJ 1384(完全背包变形)
题意:这是一个关于小猪存钱罐的问题,给你小猪存钱罐的最初重量和装满重量,然后再给你一些金币,金币有价值与重量,求小猪装满的情况下价值最小是多少。思路:容量很容易求出,但是问题是如何求出最小价值,那么可以想到初始化和dp条件,初始化为inf,但是dp[0][0]必须设置为0,这样是满足条件的情况。对于完全背包又忽然理解了为什么要从w[i]开始遍历,这里的状态是在这个j下这个物品要不要原创 2016-11-20 20:10:40 · 481 阅读 · 0 评论 -
POJ1742 (dp 多重部分和问题)
题意:要买一个m价钱的东西,现在有一些硬币,每种硬币个数和价值不同,求能用这些硬币在1~m的价格中买到几种东西。思路:以dp[j]中j为价格为j的物品,dp[j]的值为第i种硬币的个数,以此来把三种情况推出来。 1.在i-1种之前的硬币能买到j的物品,那么久赋值为b[i]; 2.a[i]的硬币价值太高超过了j或者dp[j-a[i]] 3原创 2016-11-21 17:46:36 · 422 阅读 · 0 评论 -
POJ (dp最长上升子序列问题)
题意:一组数求最长上升子序列。思路:设置dp[i]的状态是以a[i]为结尾的最长子序列。那么可以想到只要弄清楚小于i的数字或者字符就行了。#include#includeusing namespace std;#define Max 1010int dp[Max];int a[Max];int main(){ //freopen("in.txt","原创 2016-11-21 18:22:03 · 316 阅读 · 0 评论 -
POJ3903(dp最长上升子序列STL)
题意:看样例就知道。思路:dp[i]的状态是长度为i+1的上升子序列中最小的值。这里用到了STL lower_bound头文件是“algorithm”,函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置#include#include#includ原创 2016-11-21 19:13:04 · 732 阅读 · 0 评论 -
POJ 2229 (dp)
题意: 分解一个数,问有多少分解的方法,分解出来的只能是2的幂。思路 很多人说是完全背包的问题,我很愚钝,没有看出来,我觉得还是从当前的状态去找答案,分解的数与之前的数相比只是多了1,则可以分成这个数是技术和偶数讨论,奇数的话和之前的数一样,因为只是加了一个1嘛。但是偶数就不同了,偶数的分解可以出现1也可以不出现,所以又出现两种情况,出现1则和之前的数一样,因为这个1就是它自己。不出现1的原创 2016-12-09 15:06:05 · 246 阅读 · 0 评论 -
POJ 2686 (状态转移dp)
题意: 有n张车票,m个城市,p条路线,现在要从a到b城市,问如何才能使时间最短, 时间是指: v到u城市的时间是dis[v][u]/t[i]/** 感悟,对于状态转移dp,思考的时候,妖之道如何建立状态, 如何利用状态,这样才知道怎么写solve()*/#include <iostream>#include <cstdio>#include <cstring>u原创 2017-03-18 19:43:24 · 344 阅读 · 0 评论 -
POJ 3311 (状态转移dp)
题意: 旅行商问题,现在有n个点,从第一个点出发,最后回到原点,但是每个点都要到 过,问怎么才能使花费最少。思路: dp[S][v] : 已经到达的点集是S,并且现在在v。 依据这个思想,去寻找下一个最短的路径。 注意: 此题需要先找到最短的路径,再去计算。#include <iostream>#include <cstdio>#include <cstrin原创 2017-03-18 20:00:32 · 418 阅读 · 0 评论 -
POJ 2479 (算不上简单的dp,可以称为简单的求两个子串和最大)
题意: 题意很简单,给n个数,求出两个无交叉的两段和最大,输出和。思路: 一般会想到,求两次子串,但是问题是这样会出现重合的现象。 所以按照书上的方法是不合适的,所以需要另寻方法。问题是左串+右串,可不可> 以先把一种情况全部求出?可以的,比如把左边的每个最大串的和保存到一个数 组里面,然后再想办法找出右串,所以此时找到右串比较好的方法是用相同的方法从右边遍历,然后找到右串与原创 2017-03-17 09:38:52 · 1426 阅读 · 0 评论 -
POJ 2955 (dp括号匹配)
题意: 给出一行字符串,里面有 () [] 四种括号,求出有多少个已经匹配好的括号。思路 区间dp: 我们把dp[i][j]表示从i到j里面有多少已经配好的括号,那么我们假如知道了 i 到 j 区间的最大匹配,那么i+1到 j+1区间的就可以很简单的得到。 那么 假如第 i 个和第 j 个是一对匹配的括号那么dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ]原创 2017-05-12 13:33:34 · 417 阅读 · 0 评论 -
POJ 1141 (dp括号匹配 保存路径)
题意: 给出一个字符串,求出怎么最少添加括号才能使其完全匹配。思路: 之前我们知道怎么求出原本存在的括号匹配的数目,dp[i][j]是记录从i到j的最大匹配 数,并且能用一个二维数组pos[i][j]保存dp[i][j]从哪里分开才能得到最大的匹配数目 利用保存的pos,dfs实现输出。这个dfs厉害了,想不到还能这样玩。#include <iostream>#includ原创 2017-05-12 15:19:06 · 315 阅读 · 0 评论 -
南阳理工oj 整数划分(DP)
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷。。亲爱的你能帮帮他吗? 问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求原创 2017-05-12 20:38:59 · 628 阅读 · 0 评论 -
51 Nod 夹克老爷的愤怒
汉语题:能直接理解需要什么算法,但是对提高英语不太友好。思路: 这道题属于树形dp,之前写了一道树形dp 的题,以为不过如此,现在发现,太天真 因为基本每一道题的状态都不一样,而状态才是解题的关键。这里的状态是dp[x],表 示能为x 的上层根提供的家丁覆盖程度,我称它为渴望程度,如果为负数的话就是需 要的家丁长度,整数的话就是提供的家丁程度。那么状态的转移就是,从当前的状态原创 2017-04-23 10:55:37 · 367 阅读 · 0 评论 -
51nod 苹果曼和树 (树形dp)
汉语题: 苹果曼有一棵n个点的树。有一些(至少一个)结点被标记为黑色,有一些结点被标 记为白色。 现在考虑一个包含k(0 ≤ k < n)条树边的集合。如果苹果曼删除这些边,那么会将这 个树分成(k+1)个部分。每个部分还是一棵树。 现在苹果曼想知道有多少种边的集合,可以使得删除之后每一个部分恰好包含一个黑 色结点。答案对1000000007 取余即可。思路:原创 2017-04-23 15:37:12 · 608 阅读 · 2 评论 -
POJ 2342 (树dp)
题意: 一个公司要开party,想要邀请很多人来,每一个人来都代表着有趣值,但是如果有两 人是直接上下级的关系,则不允许。求出最大funny值。思路: 关系是以树的形式给出,适合树dp。。。那么怎么想呢?考虑这种状态,一个人去, 则其直接子节点不去,如果他去,其直接子节点可去,可不去。 好吧!其实状态已经给出了。具体看代码。#include <iostream>#in原创 2017-04-23 19:05:51 · 313 阅读 · 0 评论 -
51Nod 1050 循环数组最大子段和
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续 的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考a[n1],a[n],a[1],a[2] 这样的序列)。当所给的整数均为负原创 2017-05-24 20:18:04 · 479 阅读 · 0 评论 -
51 Nod 1021 石子归并
题意: 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)原创 2017-05-24 20:59:54 · 382 阅读 · 0 评论 -
CF D. Kefa and Dishes (状态转移dp)
题意: 一个人去点餐从n种点出m种。每一种菜都会有一个满意度,并且他制订了k个规则 ,若a在b之前吃的话,会额外得到满意度。求出最大满意度。思路: 由于问题的规模不大(1 ≤ m ≤ n ≤ 18, 0 ≤ k ≤ n * (n - 1)),所以很明显要用到状态转移 dp,若何用呢?想到需要一个状态st表示菜的选择状态,i表示以第i种菜为结尾的最大 值,则遍历st的每一种原创 2017-04-23 18:47:37 · 440 阅读 · 0 评论 -
HDU 2955 (01背包变形)
题意: 有n个银行,一个大盗想抢劫银行,在每一个银行都有被抓主的概率。现在就是给出一 概率P,表示他能够在<= P概率之下的风险去抢劫。每次抢劫成功都把银行的钱拿走 问最多拿多少。思路: dp[i]表示抢劫得到的钱i下,所不被抓的可能性最大。 难点:预处理,深度理解dp表示的含义。 dp[0]表示不抢劫所被抓住的概率为1,那么就按照0-1背包写出就行。#inclu原创 2017-05-08 21:30:28 · 457 阅读 · 0 评论 -
HDU 2191 多重背包的二进制实现
题意: 输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。Output 对于每组测试数据,请输出能够购买大米的最多重量,你可以原创 2017-05-09 11:19:45 · 303 阅读 · 0 评论 -
CF The Galactic Olympics (DP)
题意: 有k个比赛,n个人,现在要求k个比赛每一个只能参加一个人,每一个人至少参加 一个比赛。问所有满足条件的排列种类数目。思路: 以后遇到这种题要考虑怎么定义状态,怎么递推。 dp[i][j]代表的意义是i场比赛j个人满足条件的种类数目。 状态定义之后,递推需要分情况,当i小于j时dp[i][j] = 0,当i=j时dp[i][j] = i!。 当j = 1时,d原创 2017-05-29 20:23:45 · 372 阅读 · 0 评论 -
51 Nod 1051 最大子矩阵和 (DP)
题意: 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的 ,输出这个最大的值。 例如:3*3的矩阵: -1 3 -1 2 -1 3 -3 1 2 和最大的子矩阵是: 3 -1 -1 3 1 2 Input 第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。 第2 - N + 1行:矩原创 2017-05-30 09:31:11 · 459 阅读 · 0 评论 -
51Nod 1092 回文字符串
题意: 回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。每个字符串都可以通过向中间添加一些字符,使之变为回文字符串。 例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba。方案1只需要添加2个字符,是所有方案中添加字符数量最少的。 Input 输入一个字符串Str,Str的长度 <= 1000。 Output原创 2017-05-30 10:53:10 · 354 阅读 · 0 评论 -
51Nod 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题收藏关注给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。 比如两个串为:abcicba abdkscabab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。 Input 第1行:字符串A 第2行:字符串B (A,B的长原创 2017-05-21 23:46:59 · 295 阅读 · 0 评论 -
Codeforces Round #416 (Div. 2) C - Vladik and Memorable Trip
题意: 有n个数字排列一行,现在让你选出几个段求出每一个段的异或然后相加,输出最大的 和。但是有一个条件是选出的段中如果有一个数字那么这个段需要包括所有的出现这 个数字的位置。思路: 谁会想到这是dp呢?dp[i] 表示1~i之中所有分段的情况最大值,如果在1小于j小于等 于i的时候出现了符合题意的情况就保留最大值。#include <iostream>#includ原创 2017-06-17 21:15:49 · 298 阅读 · 0 评论 -
51Nod 1009 数字1的数量
1009 数字1的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1 的个数。 例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。 Input 输入N(1 <= N <= 10^9) Output原创 2017-05-23 22:34:25 · 468 阅读 · 0 评论 -
51Nod 1007 正整数分组
1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 将一堆正整数分为2组,要求2组的和相差最小。例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。 Input 第1行:一个数N,N为正整数的数量。第2 - N+1行,N个正整数。 (N <= 10原创 2017-05-22 18:17:24 · 266 阅读 · 0 评论 -
Minimum Edit Distance POJ 3356 && 51Nod 1183
1183 编辑距离 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由 一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成 另一个字符,插入一个字符,删除一个字符。 例如将kitten一字转成sitting:原创 2017-05-22 20:08:04 · 284 阅读 · 0 评论 -
51Nod 1202 子序列个数
思路: dp[i]表示第以i个数字结尾的子序列的个数 那么在递推的过程中可能有两种情况当a[i]没有出现过的时候,dp[i] = dp[i-1]*2 + 1,因为相当于在dp[i-1]个子序列中新增一个a[i],再加上它本身。当a[i]出现过的时候就要去重,减去以a[i]以前出现的位置的前一位子序列的个数,因为a[i]为结尾重复了。注意:每次要更新每一个数字出现的位置。#include原创 2017-06-07 21:15:53 · 357 阅读 · 0 评论 -
51Nod 数字0到9的数量 (数位DP)
跟1009题类似: http://blog.csdn.net/since_natural_ran/article/details/72668443但是还是这道题考察能力强。 对于数字的考察有时候要多多注意规律,比如之前求1的数量的时候只是考虑了1,而其它的数字有时候和1有不同的情况,比如0. 按照其它的数字算的话总是0能多算一个dp[len-1]所以要减去。#include <iost原创 2017-06-06 21:44:16 · 498 阅读 · 0 评论 -
51Nod 1270 数组的最大代价
数组A包含N个元素A1, A2……AN。数组B包含N个元素B1, B2……BN。并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi。数组A的代价定义如下:S = |A(i)-A(i-1)|的和(公式表示所有两个相邻元素的差的绝对值之和) 给出数组B,计算可能的最大代价S。 Input 第1行:1个数N,表示数组的长度(1 <= N <= 50000)。 第2 - N+1行:每原创 2017-06-03 21:49:24 · 342 阅读 · 0 评论 -
51Nod 换零钱
N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元。 例如:5分钱换为零钱,有以下4种换法: 1、5个1分 2、1个2分3个1分 3、2个2分1个1分 4、1个5分 (由于结果可能会很大,输出Mod 10^9 + 7的结果) Input 输入1个数N,N = 100表示1元钱。(1 <= N原创 2017-06-04 16:41:28 · 451 阅读 · 0 评论