![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM_DP
文章平均质量分 72
9974
这个作者很懒,什么都没留下…
展开
-
Codeforces DP第二弹
比赛链接 代码全在里面 打*的算是好题吧1 / 1Problem ACodeForces 61DEternal Victory1 / 3Problem BCodeForces 67APartial Teacher1 / 3Problem CCodeForces 148EPorcelain原创 2014-03-31 19:08:28 · 1590 阅读 · 0 评论 -
POJ 1014 Dividing 多重背包
让物体的重量等于价值,用总价值的一半的包去装这些物品,看其是否能装满View Code #include#includestring.h>int dp[120005], a[8];int max(int a, int b) { return a > b ? a : b;}int main(){ int i, j, cas = 1, n, m; w原创 2013-08-29 10:36:48 · 732 阅读 · 0 评论 -
codeforces 159D dp + strings 好题
关键:很巧妙的枚举思路,枚举回文字符串中间字符的位置i,复杂度O(n),然后统计 以i为起始位置的回文串的个数放在数组p[]中,以末尾位置的回文串的个数放在数组q[]中。最后处理一下即可View Code #include#includestring.h>#define lld __int64char s[2006];int p[2006], q[2006];原创 2013-08-29 10:36:46 · 895 阅读 · 0 评论 -
【转】POJ DP 分类
红色表示已经A。打星号的表示个人认为比较经典,或是算法比较好的题目 1014* Dividing 半个背包,注意中断,否则可能TLE1036 Gangsters 可以很水的DP过,还有多种优化的方法1038* Bugs Integrated, Inc.状态压缩1050 To the Max最大子矩形 枚举每个列数为n的矩阵,然后对这些矩阵分别进行DP处理1080原创 2013-08-29 10:36:52 · 1560 阅读 · 0 评论 -
POJ 1141 Brackets Sequence 经典区间DP题
记忆化搜索:View Code #include#includestring.h>#includestring>#include#includeusing namespace std;#define inf 1000000000struct node{ int v, vis; // v 表示DP的值,加入的最少的括号个数,vis表示dp这一个状原创 2013-08-29 10:36:57 · 924 阅读 · 0 评论 -
POJ 2923 Relocation 状态压缩DP + 0-1背包
比较综合的题目。题意:有n个物品,有两辆车载重分别是c1,c2.问需要多少趟(c1,c2一起运一次就算1趟)能把物品运完。n比较小,只有10,而且需要把所有物品全部运完,便想到状态压缩来保存状态。首先记录好所有的可行状态,对于状态state能一趟运完。然后再利用01背包,dp[j],表示已运的状态为j,如果状态j与state[i]不冲突,则可以从状态j运一趟变为j|state[i]。Vie原创 2013-08-29 10:34:07 · 812 阅读 · 0 评论 -
HDU 1561 The more, The Better 树形DP(0-1背包)
中文题,题意自己看树形DP将0设为根节点,总攻击数为m,背包容量应该是m+1(0点也看做城堡);基础的树形DP,自己推一下状态转移方程吧。 View Code #include#includestring.h>#include#includeusing namespace std;vectorint>edge[224];int dp[224][224原创 2013-08-29 10:34:05 · 720 阅读 · 0 评论 -
ZOJ 2156 Charlie's Change 多重背包(带路径)
题意:给定一个面值Price, 1美分的硬币有c[1]个, 5美分的硬币有c[2]个,10美分的硬币有c[3]个,25美分的硬币有c[4]个,求用给定的硬币兑换Price面额的钱,并且要求硬币数最多,求出每种硬币得用多少个.题目关键:要保存路径,然后输出。我们用pre[j]表示最新更新j的那个状态,j-w[i]等状态,因为多重背包里有二进制压缩,有些状态转移1次纸币数量不一定只加了1,所以原创 2013-08-29 10:34:00 · 708 阅读 · 0 评论 -
POJ 2063 Investment 完全背包
题意:给你一些钱去投资,现在有n种股票,每种股票都有一个价值和年收益,问你如何投资在d年后的最大收益并且股票的价值都是1000的倍数,预处理:对每个价值除以1000,减少内存。完全背包,每投资一年,你的钱会变多,即背包总容量会变大。对每一年的资金进行完全背包,然后更新背包总容量,d次循环后得出答案dp上界:每次投资最多获利本金的10%,所以先写个程序计算出dp上界 1000000.原创 2013-08-29 10:33:51 · 669 阅读 · 0 评论 -
POJ 1252 Euro Efficiency 2个完全背包
题意:给6个纸币面额,求出用最少的这6个纸币凑出1-100的面值,求这1-100需要的纸币数种的最大值。解题思路:2个完全背包。注意点:(1)可以相加也可以想减,(2)注意上限,考虑极端数据1 95 96 97 98 99。貌似计算出48次数最多,大概估计不超过30次,所以dp开30*100,如果懒得考虑,直接开100*100。AC代码:View Code原创 2013-08-29 10:33:49 · 705 阅读 · 0 评论 -
HDU 3535 AreYouBusy 经典混合背包
经典混合背包 题目给了很多类别的物品。用 数组dp[i][j],表示第i组,时间为j时的快乐值。每得到一组工作就进行一次DP,所以dp[i]为第i组的结果。 第一类,至少选一项,即必须要选,那么在开始时,对于这一组的dp的初值,应该全部赋为负无穷,这样才能保证不会出现都不选的情况。状态转移方程:dp[i][j]=max(dp[i][j],max(dp[i][j-原创 2013-08-29 10:33:47 · 640 阅读 · 0 评论 -
POJ 1948 Triangular Pastures 二维 0-1背包
题意:给了n个边,要求每条都用上,组成一个三角形,求三角形面积最大值的100倍(取整数);分析:我们可以开个二维数组dp[i][j]来记录三角形的两条边的长度i,j,那么另一条边就是总长度减去i和j。疑问:判定能构成三角形的条件,设p为三角形的半周长,a+b>c 两边同时加上c 则 2*p >2*c 即 p>c,同理p>a,p>b。由海伦公式S=sqrt(p*(p-a)*(p-b)*(原创 2013-08-29 10:33:42 · 802 阅读 · 0 评论 -
POJ 3628 Bookshelf 2 0-1背包 or DFS 水题
我竟然做了一题水题,浪费我感情啊,5分钟内2个AC(还是1A);1.0-1背包View Code #include#includestring.h>#includeusing namespace std;int w[22];bool dp[20000000];int main(){ int n, m, i, j, b; while(~原创 2013-08-29 10:33:40 · 838 阅读 · 0 评论 -
POJ 1976 A Mini Locomotive DP
类似 《hdu 搬寝室》View Code #include#includestring.h>#includeusing namespace std;int dp[50003][4],a[50003];int main(){ int cas, n, m, i, j; scanf("%d",&cas); while(cas--)原创 2013-08-29 10:33:35 · 958 阅读 · 0 评论 -
HDU 1421 搬寝室 类似背包DP
思路:把重物从小到大排序,计算出每2个相邻的重物产生的疲劳度,放在p[i]数组中,表示i与i+1这2个重物产生的疲劳度。 dp[i][j]表示进行到第i个物品(i前面的物品不一定都选了,跟背包差不多,i表示进行到第i个物品),已经选了j对物品 产生的最小疲劳度。初始化:先把所有值赋值为INF(无穷大),然后dp[i][0]=0;(0 for(i=0;i)原创 2013-08-29 10:33:29 · 705 阅读 · 0 评论 -
POJ 1157 LITTLE SHOP OF FLOWERS 水DP
注意边界View Code #include#includestring.h>#includeusing namespace std;#define inf 1000000000int max(int a, int b) {return a > b ? a : b;}int n, m;int a[103][103], dp[103][103];int m原创 2013-08-29 10:36:59 · 963 阅读 · 0 评论 -
POJ1088-滑雪 记忆化DP
DP+DFS,记忆化搜索,典型的用空间换时间。View Code #include#includestring.h>int dp[101][101],h[101][101];int dir[4][2]={1,0,-1,0,0,1,0,-1};int m,n;int dfs(int x,int y){ if(dp[x][y])return dp[x][y原创 2013-08-29 10:31:58 · 792 阅读 · 0 评论 -
POJ 2479 Maximum sum DP
View Code #include#includestring.h>int a[50003];int f[50003], g[50003];#define inf 1000000000int max(int a, int b) { return a > b ? a : b;}int main(){ int i, j, cas, n; sca原创 2013-08-29 10:37:01 · 799 阅读 · 0 评论 -
Codeforces DP第三弹
基本都是div2的D,E题比赛链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=43325#overview1 / 10Problem ACodeForces 132CLogo Turtle1 / 5Problem BCodeForces 8CLooking for原创 2014-04-03 11:48:38 · 1274 阅读 · 2 评论 -
Codeforces Round #237 (Div. 2)(D)
这场比赛比得非常搓,cf已经连跌7场了,从紫变绿,算是很少见的了吧,在这几场跌分的比赛中我一直在反思为什么老是这样,今天把头发剪短了些,让自己换一种状态做题,提醒自己必须要注意的一点,做一道题,先想清楚了再写。赛后苦逼地补了D题,最近做DP感觉自己智商实在不行,花了比较长的时间,智商实在是不行。小小总结一下这个比较常见的题型D方法一:(我的做法)dp[i][j]j = 0 表示i行原创 2014-03-20 21:36:18 · 1045 阅读 · 0 评论 -
2011-2012 Stanford Local Contest, 8 October, 2011(完全) (2013区域赛练习)
比赛入口 MycodeA 看懂题意以后, 3的k次方为一组找3的k+1次方与它的关系,简单推一下B 可以dp公式,我YY的,答案为2^(2*n-1)*1*3*...*(2*n-1)C n条边有两种情况: 有一个简单环 或者 有一条重边 1.如果有环, 我们用dfs预处理出 dfs第一个搜到的环上的点pos 到环上任意点 的原创 2013-11-12 09:49:39 · 2170 阅读 · 0 评论 -
Codeforces Round #230 (Div. 1)B,C
B.汉诺塔问题原型就是用递归解的,这里加上了每步的费用,无非是 递归+dp一下,也就是记忆化dp就可以了注意long long#include #include #include #include #include using namespace std;typedef long long ll;int t[4][4];const ll inf = 1e18;type原创 2014-02-19 16:46:05 · 1344 阅读 · 0 评论 -
hdu 4778 13杭州I题 状态压缩dp+博弈
分析:博弈的过程是一个树,而且要知道在最优策略情况下,肯定是选择了树上的某一条树枝,也就是一条路径。所以我们可以用dp来找出某一条最优路径,而且我们可以发现2个人博弈的目的是为了让自己与另一个人的差值尽可能的大。解法:用dp[i]表示状态i(能拿的置为1)的情况下先手减去后手分数的最大值。初始化dp[1对于dp[i], 选第j个包, 如果这次拿好分数增加tp, 那么用 dp[i原创 2013-11-09 20:59:35 · 2900 阅读 · 0 评论 -
light oj 1147 背包dp+状态压缩 好题
题意:n个物品(2100000。思考:如何保存两堆物品个数差值是这题的关键。如果没有平均分,那么我们假设sum为总重量, 搞个sum/2的背包去装,dp结束以后就O(sum/2)扫一遍。 分析: 但这里要求平均分,我们想想没有平均分的做法dp里面的值是bool型的,这题我们可以扩增dp里面的值,来保存我装满了j的背包是由几个物品构成的,当然要记录所有的组合情况,考虑到n只有100,对半分后原创 2013-11-07 21:04:48 · 1254 阅读 · 0 评论 -
light oj 1073 状态压缩dp+输出字典序最小的解
算是比较基本的题,不忍直视的搓代码,string乱搞后惨不忍睹,调了好久终于AC,代码能力弱成渣给你的一些串中,你先暴力去掉一些无用的子串, 比方有aaaa 和aa,那aa就没用了,去掉然后从下往上放字符串(注意方向,为了输出字典序最小),我的val[i][j]表示串i在下,串j在上所增加的str[i]的前缀长度 如 aabb bbcccc, 那前缀为aa,长度为2然后dfs搜原创 2013-11-07 20:46:19 · 1320 阅读 · 0 评论 -
HDU 2196 Computer 树形DP(2个dfs)
树形DP, 2 个dfs。前几天觉得很难,现在可以说是水题了。View Code #include#includestring.h>#includeusing namespace std;#define maxn 10003struct E{ int v, next, w;}edge[maxn1];int tot, head[max原创 2013-08-29 10:35:42 · 632 阅读 · 0 评论 -
HDU 4126 Genghis Khan the Conqueror prim + 树形DP 好题
题意:一个N个点的无向图,先生成一棵最小生成树,然后给你Q次询问,每次询问都是x,y,z的形式, 表示的意思是在原图中将x,y之间的边增大(一定是变大的)到z时,此时最小生成数的值是多少。最后求Q次询问最小生成树的平均值。 N=10000思路:先求出该图的最小生成树,用prim(), O(n^2)。对于每次询问, 都是将a,b之间的边增加到c, 会出现 两种情况:1. 如果边权原创 2013-08-29 10:35:49 · 786 阅读 · 0 评论 -
POJ 1952 BUY LOW, BUY LOWER DP 最长下降序列求个数
注意:重复的只算一次如何去掉一些重复的是本题的关键我的去重思路:75 3 7 6 3 2 165 3 7 3 155 3 2 1 3第一组在推到 数字 2 的时候有 3会出现重复, 显然前面一个3是可有可无的。第二组也一样,前面一个3是可有可无的。1.如果最长下降序列中有后面一个3, 如第一二组数据,那么前面一个3是无用的,在推好后面一个3之后把之前的所原创 2013-08-29 10:37:03 · 1024 阅读 · 0 评论 -
zstu2552---马棚问题 DP
题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2552动态规划基本步骤(本人觉得):1.确定数组的维数,一维,二维等等;2.弄清数组下标的含义3.找出状态转移方程式;4实现自己的想法;本题思路:二维数组dp[i][j],i表示前i个马棚放马完毕,j表示队列前j匹马已经进入马棚,dp[i][j]记录前原创 2013-08-29 10:32:01 · 1246 阅读 · 0 评论 -
n*logn最长上升序列
hdu1025 2分查找+DP;View Code #includeint a[500001],b[500001];int main(){ int u=1,n,x,y,i,j; while(scanf("%d",&n)!=EOF) { for(i=1;i) { sc原创 2013-08-29 10:31:40 · 791 阅读 · 0 评论 -
HDU 3586 Information Disturbing 树形DP
代码1:View Code #include#includestring.h>#includeusing namespace std;#define maxn 1003#define inf 1<<29struct node{ int v, next, w;}edge[maxn1];int head[maxn];int to原创 2013-08-29 10:35:33 · 757 阅读 · 0 评论 -
HDU 2159 FATE 二维0-1背包
dp[i][j]记录疲劳度用了i,杀了j个怪所获得的最大经验。 View Code #include#includestring.h>#includeusing namespace std;int dp[103][103];int w[103],p[103];int main(){ int n, m, k, s, i, j, x; w原创 2013-08-29 10:33:27 · 559 阅读 · 0 评论 -
HUD 1248 寒冰王座 0-1背包入门题
不解释View Code #include#includestring.h>#includeusing namespace std;bool dp[10003];int main(){ int cas, m,a[4]={0,150,200,350}; int i, j; scanf("%d",&cas); while(ca原创 2013-08-29 10:33:20 · 908 阅读 · 0 评论 -
POJ 2955 Brackets 区间DP 入门题
经典的区间DPdp[i][j]代表i->j区间内最多的合法括号数状态转移方程:if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp[i][j]=dp[i+1][j-1]+2;dp[i][j]=max{dp[i][k]+dp[k+1][j]};AC代码:View Code #include#includ原创 2013-08-29 10:33:33 · 673 阅读 · 0 评论 -
HDU 1024 Max Sum Plus Plus 经典 DP
首先申明:这题数据有很大问题当你输入都为负数时,程序就会出错如 2 3-1 -2 -3竟然输出-3。数据库里有都为负数的情况,我用别人AC代码改了一下测试过了,的确有这情况,但答案貌似是错的。又如 2 3-1 2 -3竟然输出1.这让我郁闷了很久。 设输入的数组为a[1...n],从中找出m个段,使者几个段的和为最大dp[i][j]表示前j个数中取i原创 2013-08-29 10:33:31 · 602 阅读 · 0 评论 -
HDU 1203 I NEED A OFFER! 0-1背包
用dp[j]记录用j块钱最小不录取的概率。初始化dp[]都为1.0,因为没有选录取的概率为0,不录取的概率为1;View Code #include#includestring.h>#includeusing namespace std;int w[10001];double p[10001],q[10001],dp[10001];int main(){原创 2013-08-29 10:33:24 · 574 阅读 · 0 评论 -
HDU 2546 饭卡 简单0-1背包+稍作处理
中文题,题意自己看。思路:1.如果一开始钱少于5元,不买东西,按原值输出;2.否则,先拿这五块钱买最贵的一份菜(输入菜的价格后用sort排序一下),然后对其它n-1个菜进行0-1背包处理 View Code #include#includestring.h>#includeusing namespace std;bool dp[1001];int a原创 2013-08-29 10:33:22 · 627 阅读 · 0 评论 -
POJ 1384 Piggy-Bank 完全背包
完全背包 这里要装满,所以 要注意dp初始化:dp[0]=0;当求背包最小值时dp[i]=INF(无穷大) (1反之 dp[i]= -INF(无穷小) (1View Code #include#includestring.h>#include#define INF 1000000000using namespace std;int dp[原创 2013-08-29 10:33:17 · 697 阅读 · 0 评论 -
POJ 2817 WordStack 状态压缩DP 入门题
一些二进制的基本知识:判断j是否属于集合i:i&(1在集合i中去除j:i-(1在集合i中加入点j:i|(1 先预处理出len[i][j]表示第i个字符串与第j个字符串组合能匹配的最大字符数用一个数的二进制来表示那些字符串,那些字符串还没有选,即二进制位为1 的表示已经选了,为0的表示还没有选Dp[i][j]代表当选取的字符串为i状态,且最后一个选取的字符串是第j个字符串原创 2013-08-29 10:33:15 · 747 阅读 · 0 评论 -
POJ 1276 Cash Machine 多重背包
多重背包看了《背包九讲》,此题1A,爽!!!根据《背包九讲》提供的伪代码:procedure MultiplePack(cost,weight,amount) if cost*amount>=V CompletePack(cost,weight) return integer k=1 while knum原创 2013-08-29 10:33:09 · 807 阅读 · 0 评论