![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划dp
文章平均质量分 60
liujc_
这个作者很懒,什么都没留下…
展开
-
hdu 1074 状压dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:有n个作业,对于每一个作业有一个deadline,有一个完成这作业所需要的时间。如果超过deadline一天就要扣一分,求怎么安排写作业的顺序才能保证扣的分最少。 思路: 对于每一个作业有三个元素,名字,ddl,所需要的时间。 用不同的状态表示当前作业完成的情况,运用状压dp 定义原创 2015-11-01 23:25:31 · 344 阅读 · 0 评论 -
hdu 1160 dp 入门
链接http://acm.hdu.edu.cn/showproblem.php?pid=1160感觉也是最长上升子序列的变形。。。这回独立1Y!开心~ 不过在保存路径的时候调了一段时间orzzzzz还是太弱思路:每个老鼠进行排序,将体重从小到大,若相等再将速度从大到小,保证找出最多的。定义dp[i]表示以i为末尾的满足条件的最长的序列长度。运用最长上升子序列的那种方法就可以做了,原创 2015-05-01 17:48:03 · 589 阅读 · 1 评论 -
hdu 1421 dp 入门题
http://acm.hdu.edu.cn/showproblem.php?pid=1421中文题思路:首先要找出怎么将所有的物品组合成一对一对的,题目要求疲劳之最小,也就是一对之中两个物品的重量的差距最小。那么就需要运用排序了,将物品从小到大排序,从遍历物品直到倒数第二个,将每一个物品和下一个物品组合成一对,这样就会发现如果我们先选了这一对,那么下一对就不可以选了,因为两者中有一个元素是原创 2015-04-28 20:28:24 · 407 阅读 · 0 评论 -
hdu 1069 dp入门 最长上升子序列变形
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069实在太弱。。。。并没有看出这是最长上升子序列的变形。。。想了一点思路写下去发现有的完全不对,是在不知道怎么改了,去看了别人的思路,结果是最大递减升子序列的和。。。感觉懂了。。。思路:首先每个木块都有三种形式,(在默认长一定比宽大的情况下,可以舍弃宽比长大的那三种情况,因为只要这个有长比宽大的,原创 2015-04-30 20:29:51 · 596 阅读 · 0 评论 -
hdu 2571 dp入门题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571常规dp,刚好让我这菜鸟来找找 找状态转移方程的感觉。。定义dp[i][j] 表示的是第i行j列所拥有的最大的幸运值。dp[i][j] 由三种情况转移而来:1、从上面一个坐标转移而来,即dp[i-1][j] 。2、由左边转移过来,即dp[i][j-1]。3、由他同一行中的 j 的因数原创 2015-04-30 15:30:13 · 873 阅读 · 0 评论 -
hdu 1422 dp入门题
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422中文题。将每个城市生活费和花费的差都存起来。从头开始找能否去这个地方能的话就将数目+1,但是他这个是可以是一个环形的顺序的(也就是起点并不一定要在第一个),结果估计是我太笨了,想枚举起点(orzzzzz虽然觉得10^6这个O(n^2)估计妥妥超时),但是还是写了下orzzz结果如我所料就是T了原创 2015-05-02 18:30:16 · 978 阅读 · 2 评论 -
soj 4421 laobi与回文子串
链接:http://cstest.scu.edu.cn/soj/problem.action?id=4421上次初赛我们队并没有出这题,,只能眼睁睁的看着出了好多只队。。。思路:将这个字符串翻转过来,然后运用最长公共子序列的方法求出最长的长度,这个就是删掉任意个字符后最长的回文子串。代码:#include #include #include #include using n原创 2015-05-02 14:11:24 · 514 阅读 · 0 评论 -
hdu 2084 dp入门数塔问题
http://acm.hdu.edu.cn/showproblem.php?pid=2084转移方程:dp[i+1][j] = max(dp[i][j-1]+a[i][j],dp[i][j]+a[i][j]);我又是愚蠢的正着做···代码:#include #include #include #include using namespace std;#define原创 2015-04-27 13:33:05 · 480 阅读 · 0 评论 -
hdu 1176 dp入门题
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176转移方程:dp[i][j] = s[i][j]+max(dp[i-1][j],max(dp[i-1][j-1],dp[i-1][j+1]));不过后来发现根本不需要这样开两个直接在原来的数组上处理就可以了。。还有就是其实倒着来做比较方便,这个就是类似数塔问题的。。。正着做一开始原创 2015-04-27 13:14:16 · 403 阅读 · 0 评论 -
codeforces 567F mausoleum dp
http://codeforces.com/problemset/problem/567/F dp 没有想出来,感觉这题还是比较有意思。 题意: 有n个数,要求放置。每个数要放置两次。要求最后整个序列的顺序是先不减后不增。还给出了k个限制条件。求满足这些条件的序列的总数。 思路: 还是比较容易想到是用dp做的。就是不知道怎么转移状态。。。orz 因为小的数字总是要在大的数字的两边的,可原创 2015-08-21 14:18:14 · 1124 阅读 · 0 评论 -
codejam 2008 APAC local onsites C 概率dp
链接:https://code.google.com/codejam/contest/32005/dashboard#s=p2 概率dp着实不懂。。只能学习。 解法: 首先发现这个问题是一个连续的问题,因为你的赌注是任意的,还可以是小数。但是可以从最简单的情况入手来分析。 从只有一轮的时候分析,1)如果手上直接有100w的钱就有1的概率可以带回家,2)如果手上小于50w的钱,那么怎么样都不可原创 2015-08-03 14:54:01 · 959 阅读 · 0 评论 -
hdu 1078 记忆化搜索
hdu 1078 http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意:每次可以朝一个方向走k格,必须走到一个数值比当前值大的点,问最多数值加起来能有多少,走到不能再走。 一开始定义错了,定义dp[i][j] 为以(i,j)为终点时所能得到的最大值。 dp[i+t*dx][j+t*dy] = max(dp[i+t*dx][j+t*dy],dp[i]原创 2015-10-24 23:14:47 · 478 阅读 · 0 评论 -
挑战练习题 基础的动态规划算法
poj 3176 数塔 比较容易 每个数可以由他上面左边和正上面的数转化而来。#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define M 400#define INF 0x3f3f3f3fint dp[M][M];int s[M][M];原创 2015-08-10 11:31:24 · 364 阅读 · 0 评论 -
codeforces 156C Cipher 组合数学 字符串dp
链接:http://codeforces.com/problemset/problem/156/C 题意: 给定一个字符串,有两种操作。1)选一个位置Sp, 将Sp的字母往后一位(例如a->b),Sp+1的字母往前一位。2)选一个位置Sp, 将Sp的字母往前一位(例如a->b),Sp+1的字母往后一位。(z没有后一位,a没有前一位) 定义两个字符串一致意味着由一个字符串进行n次这种操作后可以变原创 2015-09-08 19:59:26 · 627 阅读 · 0 评论 -
poj 2686 状压dp
链接:http://poj.org/problem?id=2686 题意: 有m个城市,有n张马车票,每张票上有对应的马的数量,从一个城市到另一个城市需要一张马车票,从一个城市到另一个城市的时间为距离除以马的数量。求从a到b所需要的最短的时间。 思路: 用状压dp。定义 s 表示已经用过的车票的集合,u表示现在所在的城市 。 定义dp[s][u] 现在在u处,已经用过的集合为s时所需要的最原创 2015-09-11 17:12:26 · 349 阅读 · 0 评论 -
旅行商问题 TSP问题 状压dp入门 + floyd poj 3311 hdu 5418
旅行商问题 & TSP问题:有n个城市,从起点 0 开始游历每一个城市,只访问每个城市一次,最后回到起点,所需要的最短路径是多少? 这个属于NP完全问题。最直接的方法就是枚举法,解空间为n个元素的所有排列组合,为(n−1)!(n-1)!。n稍微一大就无法在有限的时间内做出。还有一些模拟退火算法什么的,这个不太了解,有空再去了解下。 在acm中,对于此问题,n一般都不大,可以运用floyd + 状原创 2015-09-11 15:35:01 · 3816 阅读 · 5 评论 -
hdu 1003 1231 最大连续子序列的和
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003就是典型的最大连续子序列的和,我校赛初赛时发现我还不会这个,赶紧回来学习一下,应该算是入门级的dp吧。题目的大意就是说,在一个序列之中,需要找出这个序列中连续的子序列,其各个数的和是整个数列里面最大的。对于每一个数来是说都只有取和不取的两种状态,如果加上这个数之后比最大的和大那就要取,用s原创 2015-03-30 12:51:52 · 515 阅读 · 0 评论 -
zoj 3735 概率dp
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3735 题意: 你有一只三个角色的队伍,需要打败所有电脑的队伍才能获胜,打赢一个之后,可以将你的队伍成员全部换成是被你打败的那个,当然也可以不换。 给了M个角色,R = C(M,3)表示队伍数,给了个矩阵表示每种队伍之间对战的胜率。 思路: 概率dp着实还是没有原创 2015-08-29 13:36:40 · 421 阅读 · 0 评论 -
hdu 3450 离散化+dp+线段树优化
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3450 题意: 给你一串长度为n的序列,给一个d,要求找出有几个子序列能够满足两个相邻的元素之间差值不超过d。 思路: dp。定义dp[i]表示以第i个为结束的满足条件的子序列的个数。 转移方程:dp[i]=(∑i−1j=1dp[j])+1(abs(num[i]−num[j])<=d)dp[i] =原创 2015-08-29 16:01:46 · 631 阅读 · 0 评论 -
soj 2818 dp
链接:http://cstest.scu.edu.cn/soj/problem.action?id=2818背景:自己一直找不出状态转移方程,甚至定义就定义错了。。。猜了好几种,都没办法,最后无奈只能看discuss。附上satan的分析:dp[i][j][k] 左手在i,右手在j,第k个移动 初始化时 k=0 即刚开始手在 左右按键的那个状态第k=0的状态 dp矩阵 0原创 2015-04-29 18:20:01 · 479 阅读 · 0 评论 -
hdu 1087 最大上升子序列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087dp入门题。。最大上升子序列。定义dp[i] 表示以ai结尾的最大上升子序列。可以由两个状态转移过来,一个是只有ai的子序列,另一个是j转移方程:dp[i] = max(dp[i],dp[j]+a[i]);代码:#include #include #include原创 2015-04-24 17:11:31 · 492 阅读 · 0 评论 -
soj 2222 health power 01背包变形
题目链接:http://cstest.scu.edu.cn/soj/problem.action?id=2222题目大意:就是有一些物品,有两种属性,可以加hp,也可以加分数,但是只有你在血量满的时候,吃到这个物品才会加分数,不然没满的话,只能加血量。。要求怎么样才能使分数最多。思路:既然要使得到的分数最多,那么就需要让用来加血的物品的分数总和最小这样就能保证剩下的物品都用原创 2015-04-08 17:34:55 · 577 阅读 · 0 评论 -
hdoj 1864 01背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=186401背包感觉没什么好说的。就是要将题目中的小数*100化为整数处理,才能作为数组的下标。。然后有点坑的地方就是题目中说单件物品不能多于600,是指同一类比如都是A的总共不能多于600。我以为是每个都不能多于600,然后WA。。。我用了个标记数组来记录是否符合要求,不符合的就跳过。。原创 2015-03-07 17:05:05 · 450 阅读 · 0 评论 -
hdoj 2955 01背包变形+简单的概率论
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955题目一开始感觉有点无从下手,因为乍一看觉得背包容量、价值都是double,然后联想到poj2063 打算给他扩大一定的倍数,但是仔细看了下题中确实并没有明确暗示,但是想不出其他的办法只能硬着头皮做,然后妥妥的WA了,又想了一下不得法,只能去看了discuss,然后感觉发现了新的天地。。。原创 2015-03-05 11:19:52 · 508 阅读 · 0 评论 -
hdoj 1203 01背包变形
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203做这题的时候知道是01背包,但是一开始没有搞清楚这个概率怎么和01背包结合起来。后来思考了一段时间,才明白。。最后还被坑了一把,题目说要最后两个都为0,我习惯性只打了n&&m没有写成(n||m) 结果悲剧了,想半天不知道为什么,还去看了人家的····思路:假设他同时向好几所大学原创 2015-03-03 22:11:35 · 592 阅读 · 0 评论 -
poj 2063 完全背包问题
题目链接:http://poj.org/problem?id=2063本题也是完全背包。因为最近就在看背包九讲。。此题RE了,后来仔细看了下题目,确实本金一直在增长,而且年份也不少,最后的话数组的下标会变得很大。后来我就想能不能把他整除10的倍数,但是又发现利息很有可能变成小数,然后我又想把类型改成double,但是数组下标都不能是double。。。有点晕,去看了别人的题解,,顿时豁然原创 2015-03-01 18:10:22 · 595 阅读 · 0 评论 -
hdoj 2602 01背包入门题
其实这几篇有的是之前写的,但是在家里不知道怎么回事csdn一直上不去,于是来了学校顺便整理下。。http://acm.hdu.edu.cn/showproblem.php?pid=2602第一道01背包用了二维的方法解,二维的就是要注意在遍历背包容量时要从零开始,并且判断是否大于该物品的消耗,如果大于的话在考虑是否放入,否则直接就是不能放。#include#includeint f原创 2015-03-01 15:57:58 · 457 阅读 · 0 评论 -
hdoj 1248 完全背包问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1248也是一道裸的完全背包。。就是注意背包的容量以及花费都为同样的,我 写为 c 数组。增加熟练度。。#include#includeusing namespace std;int dp[10010];int c[3] = {150,200,350};int max (原创 2015-03-01 17:18:10 · 730 阅读 · 0 评论 -
hdoj 1171 多重背包问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171本题为多重背包问题。思路:既然题目中的说的是要尽可能的将A B变得相等,然后A 又一定要大于B ,那么我就想将总物品的价值的一半设置为背包的容量,以这个容量来进行多重背包求解最大值,然后判断一下这个最大值与剩下物品价值的总和的大小,如果最大值较小(也就是说如果这个最大值不到总价值的一半原创 2015-03-02 22:30:10 · 583 阅读 · 0 评论 -
hdoj 1114 完全背包入门题
看了背包九讲后找来的完全背包入门题目。。附上题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114该题跟之前的背包问题有点不同在于他要求的是最小值并且要求装满整个背包。。。所以我们在初始化的时候就要注意应该将f[0]初始化为0,其他的都要初始化为正无穷。。。那如果最后结果是正无穷那么就是不可能装满。这个在背包九讲中有提到初始化原创 2015-03-01 15:34:01 · 587 阅读 · 1 评论 -
hdoj 2159 二维费用的01背包
思路:题目中要求有最大杀怪数,那么也就是变成了二维费用问题,我们就可以将状态转移方程写成这样dp[j][k] = max(dp[j][k],dp[j-c[i]][k-1]+w[i])。然后我们顺序遍历整个数组,找出能升级的消耗最少的那个耐久度,这样就能求出最大剩余的耐久度了。。附上代码:#include#includeint dp[110][110];int w[110];int原创 2015-03-07 14:44:03 · 638 阅读 · 4 评论 -
poj 1276 多重背包问题
题目链接:http://poj.org/problem?id=1276多重背包问题练手。。价值与重量都是价格。代码:#include#includeusing namespace std;int dp[100010];int c[20];int m[20];int main (){ int v,n; while(cin >> v >> n && (v||n)) {原创 2015-03-09 23:25:50 · 425 阅读 · 0 评论 -
最长上升子序列 nlogn poj 2533
链接:http://poj.org/problem?id=2533定义dp[i] 为长度i+1的上升子序列中末尾元素的最小值从前往后遍历整个序列,对于每个aj如果i = 0或dp[i-1]代码:#include #include #include #include using namespace std;#define M 1009#define INF 0x3f3f3原创 2015-04-23 16:11:29 · 460 阅读 · 0 评论 -
hdu 1257 最长上升子序列问题
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257dp[i]表示以i结尾的最长上升子序列的长度转移方程dp[i] = max(dp[i],dp[j]+1)代码:#include #include #include #include using namespace std;#define M 100009#define IN原创 2015-04-22 21:18:37 · 422 阅读 · 0 评论 -
01背包 背包容量大时新解
01背包在之前都做过,但是好像从来没有考虑过如果背包容量超级大的时候怎么办这个问题。。。因为01背包的时间复杂度是O(n*V) V为背包容量。挑战上的这题就给了个V的范围在1~10^9,这如果按照以前的方法做想必估计就会妥妥的超时了,然而这道题给了一个很方便的地方就是物品的个数与每个物品的价值都不大,所以这里可以转换一个思路,转变为求前i个物品中价值为j时最小的重量。这样最后找出dp[n]中重量原创 2015-04-22 18:26:34 · 1497 阅读 · 0 评论 -
挑战程序设计竞赛 多重部分和问题
就类似完全背包。。不过要恰好等于背包容量。。就是给n种数ai,各mi个,判断是否能从这些数字中选出若干个使他们的和为v。用dp求解,dp[i+1][j]表示前i种数字能否加和得到j。dp[i+1][j] 只要dp[i][j-k*ai]有一个为真那么就为真。(0代码:#include #include #include #include using namespace std原创 2015-04-22 20:22:57 · 496 阅读 · 0 评论 -
hdu 1159 最长公共子序列
链接http://acm.hdu.edu.cn/showproblem.php?pid=1159基础dp,挑战上的题目。主要在于体会如何找到状态转移方程,dp的思想我现在理解来看觉得是在于怎么将一个大的问题分解成多个子问题求解,找到子问题的最优解,在比较几个子问题的最优解从而得出当前问题的最优解。然而又可以将每个子问题像这样的方式分下去,找到最优子结构。一直分解问题直到最开始的边界情况,也原创 2015-04-22 18:08:36 · 519 阅读 · 0 评论 -
hdu 1059/ poj 1014 多重背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059第i种物品的价值就是i 然后只输入每种物品的个数。。思路:如果总价值是奇数直接不可能,偶数的话然后将总价值分一半为背包容量,再进行多重背包,最后dp[v]==v 就是可以分。。还有就是格式一开始有点问题。。题目说的是每组后都要空行。。代码:#include#include原创 2015-03-09 23:31:04 · 425 阅读 · 0 评论 -
hdu 1712 分组背包问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=17121Y很开心。。分组背包就是在01背包的基础上分了多个组,每组只能取一个。这样在01背包上再加一重循环就可以了。。二维的状态转移方程:F[k,v] = max {F[k − 1,v],F[k − 1,v − C i ] + W i | item i ∈ group k}背包九讲的伪代原创 2015-03-08 23:40:53 · 401 阅读 · 0 评论 -
hdu 2844 多重背包
http://acm.hdu.edu.cn/showproblem.php?pid=2844也是多重背包问题。。就是找出能拼成几种价格。。就是一开始脑残用了一个标记数组,后来发现直接不需要,就遍历数组,当此时背包中能拿到最大的价值与背包此时的重量相等就加一种。if(dp[i] == i) count++;一开始标记数组的代码:#include#includeint dp原创 2015-03-09 23:42:24 · 387 阅读 · 0 评论