
动态规划基础dp
文章平均质量分 79
code_mryxj
这个作者很懒,什么都没留下…
展开
-
hiho一下 第264周 投掷硬币
题目:中文题目思路:非常简单的概率dp,dp[i][j]表示投掷i次,恰好j次正面的概率。dp[i][j] = dp[i-1][j-1] * p[i] + dp[i-1][j] *(1 - p[i])代码:#include<bits/stdc++.h>using namespace std;const int N= 1000+10;double dp[N][N], p...原创 2019-07-23 17:27:45 · 139 阅读 · 0 评论 -
hdu1024 Max Sum Plus Plus(最大子段和加强版)
关键字:dp 滚动数组题意:输入n,m表示 一排n个数,求m个不相交的子段,他们和最大。思路:果断dp啊,最大子段和的变形,联想最大子段和的dp[i] 设以当前i为结尾的子段和最大的结果,这里设dp[i][j]为以j结尾构成了i段不相交子段和的最大结果。我们就要思考当前dp[i][j]是由那些状态转移过来?思考这里对于每个数字,我们的策略是要么选择他作为当前这段的,要么让它单独原创 2016-01-24 19:03:15 · 530 阅读 · 0 评论 -
hdu1978 How many ways(好题 %)
题意:一个棋盘规则是,你从1,1位置开始数字是几代表你能走几步,在这个范围内的点都是你可以作为停下来的终点,前提只能向右或向下走,问到n,m一共有多少种走法。 常见有两种状态定义,1:定义dp[i][j]为从i,j出发到n,m有多少种路线,这个顺序就要逆序,所以选择记忆化搜索。#include <fstream>#include <iostream>#include <string>#inc原创 2015-12-20 21:08:02 · 488 阅读 · 0 评论 -
hdu1494(好题 DP%)
http://acm.hdu.edu.cn/showproblem.php?pid=1494题意:跑跑卡丁车的背景,每一圈被分n段跑,没跑完一段积累20%能量,能量满了变换一个加速卡,最多两张卡,多了会爆同时能量变成0,卡不变。每一段用加速卡和不用加速卡的时间分别给你,问整场跑下来最小时间,就是求最优时刻用加速卡,每个状态转移的关系很清晰,很明显动态规划可以一做。最初做这题对dp状态定原创 2015-12-20 20:49:24 · 575 阅读 · 0 评论 -
UVALive 5983
题意:从地图 1,1出发 到n,m,中间每个点正数,代表他能量会增加,负数代表能量减少,整个过程能量大于0,问最初的能量的最低值为多少。思路:典型的dp,从终点自底向上,先处理边界情况,在讨论一般情况dp[i][j]=max(1,min(dp[i+1][j],dp[i][j+1])-M[i][j]);#include #include #include #include #incl原创 2016-01-04 23:40:54 · 381 阅读 · 0 评论 -
hdu1058 & hdu3199
这两题算同一类型,都是给你几个素数,问只能由这几个素数当做因子的数排列一下,第多少个是? 整体思想都是用已生成的序列是构造新的数。 hdu1058题意:一个数的因子只能是2,3,5,7 ,满足这样条件的数叫humble数,问第多少个是多少。 和紫书上一道丑数 题意近乎一模一样,开始做法就是用优先队列和set判重(后来发现也可以不需要借用set判重)#include <fstream>#inc原创 2015-12-19 14:15:52 · 566 阅读 · 0 评论 -
hdu1080 Human Gene Functions
题意:最大公共子序列的变形。思路:见代码,太水了,就不写了#includeusing namespace std;char S[110],T[110];int ans[110][110],dp[110][110];void init(){ ans['A']['A']=ans['C']['C']=ans['G']['G']=ans['T']['T']=5; an原创 2016-01-20 11:49:42 · 479 阅读 · 0 评论 -
poj3046 Ant Counting
题意:挑战dp上 多重数分组问题,告诉你有n种数,每种数有ai个,问组成 m有多少种可能。最初的递推方程式:dp[i][j]=(求和)dp[i-1][j-k] (k#include#include#includeusing namespace std;int T,A,S,B,dp[2][110000],a[1100];const int mod=1000000;int原创 2016-01-20 18:08:27 · 386 阅读 · 0 评论 -
uva 624 CD(记录路径)
题意 : 01背包问题,但是需要记录最优状态的路径,并输出。思路:用一个vis二维数组记载,每一步是否转移,因为 dp[i][j]只能是dp[i-1][j]或是dp[i-1][j-t[i]]+t[i]其中大的转移过来,如果dp[i][j]=dp[i-1][j]说明当前没选,vis[i][j]=0;否则vis[i][j]=1,然后再从终点回溯过来。#include #include #i原创 2016-01-19 22:30:02 · 392 阅读 · 0 评论 -
hdu1421 搬寝室
题意:有n个物品,选k对求他们差的平方和最小。 思路:贪心容易想到,先排序,相邻的差最小,再根据转移方程 决定这一对选或不选。 定义dp[i][j] 前i个物品选j对出来的 最小值。 有 dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a]i-1])^2)#include <fstream>#include <iostream>#include <st原创 2015-12-18 13:33:18 · 290 阅读 · 0 评论 -
hdu 1158 Employment Planning
题意:一个公司 ,每个月需要工人数是不定的,第一次租,使用一个月,解雇有三个不同的费用,问最小花费是。 典型的dp,定义dp[i][j]前i个月有j个员工的最小花费。 推一下每个月到下个月状态转移的可能,取最小就好。#include<bits/stdc++.h>using namespace std;const int inf=0x7fffffff;int dp[15][1010],a[1原创 2015-12-23 15:02:19 · 357 阅读 · 0 评论 -
hdu 1574 RP问题
题意:每件事有三个属性,人品值a,门槛b,获益c,如果a>0,小于这个门槛b的可以做这件事,收益c为负,反之,如果a思路:由于人品值可为正负,统一加10000都处理为正,定义dp[n] 为,人品值为n时的最大效益,这里需要标记一下人如果加入这件事后,品值为n的是否出现过,没有就直接更新,有就取最优解的.#include #include #include #include原创 2016-01-08 11:02:09 · 467 阅读 · 0 评论 -
01背包问题总结
总结一下 按照:http://blog.youkuaiyun.com/libin56842/article/details/9338841 这个博客 提供的题号(感谢大牛) 和自己多加的几道01背包的题目。其状态转移方程是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}01背包的裸代码:(节省一维空间)for(int i=0;i<n;i++) for(int j=V;j>原创 2015-12-09 01:08:56 · 2622 阅读 · 2 评论 -
hiho一下 第240周 出勤记录II
题面 :Link题意:长度为n的只含有O,A,L序列,满足不能有连续三个L,最多一个A的要求的序列数量?思路:基础dp,设dp[i][j][k][l]表示长度为i序列;j用0,1,2来区分结尾为O,L,A;k用0,1,2表示连续出现几次L;l用0,1来区分A是否出现过。状态转移方程就很容易写出。貌似只用三维就可以表示,我写复杂呢…代码#include<bits/stdc++.h...原创 2019-02-21 10:27:48 · 193 阅读 · 0 评论 -
动态规划算法的优化技巧
动态规划算法的优化技巧福州第三中学 毛子青[关键词] 动态规划、 时间复杂度、优化、状态**[摘要] 动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化。全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因素,然后分别阐述了对各个决定因素的优化方法,最后总结全文。**[正文]一、引言动态规划是一种重转载 2017-03-12 20:07:53 · 5349 阅读 · 1 评论 -
hdu1712 ACboy needs your help(分组背包)
做到 hdu4003(树形dp+分组背包)发现分组背包我好想还没做过…遂补这道水题,然并暖hdu4003我还是在思考中ing.题意:Acboy 有n门课,m空闲天来选课。给你一个矩阵A[i][j]表示第i门课选修了j天则可以获利的权值,问总共获利最大是?思路:分组dp.#include<bits/stdc++.h>using namespace std;int dp[110][110],M[11原创 2016-10-19 00:40:39 · 295 阅读 · 0 评论 -
uva1471 Defense Lines
题意:给一个长度为n(n<=200000)的序列,删掉某一个连续的序列,使得剩下的序列有一个长度最大的连续递增子序列。 思路:首先这里最容易想到,枚举任意两个点j,i,删掉从j到i的序列,求剩下最大连续递增的子序列长度.i,j可以O(n)预处理,求出j处结尾的最长连续递增序列长度l[j],和i处起始的最长连续递增序列的长度r[i].这样得到一个O(n^2)的算法。 然而,n 200000的大小,原创 2016-05-07 20:23:23 · 822 阅读 · 0 评论 -
Codeforces Round #369 (Div. 2) A~D
前言:这场又蹦了。。。还是老老实实补题吧。 A:水题就不说了#include<bits/stdc++.h>#define rep(i,a,n) for (int i=a;i<n;i++)using namespace std;string s[1010];int main(){ int n; while(cin>>n){ int ans=0;原创 2016-08-30 23:51:37 · 377 阅读 · 0 评论 -
csu1646 HearthStone
好久没有写dp,这题算很基础. dp首先定义状态:dp[i][j][k]:当进行到第i轮,达拉然法师出场j个,刺骨使用k次情况下的最大伤害。 仔细考虑,还有每轮的费用,法师,刺骨使用几张的情况这些并不需要定义成状态。开始我想复杂,把这些也定义成状态,结果状态转移方程反而不好写。这里就要思考一个变换过程中并不是要把每一个变换都设置为状态的一个变量,只要拍你定义的状态容易写出状态转移方程,并能正确求原创 2016-04-28 18:29:13 · 384 阅读 · 0 评论 -
hdu5656 CA Loves GCD
题意:给你n个数ai,n和ai范围在1到1000之间,问这些数任意不重复组合的最大公约数之和取模100000007的结果。 思路:设dp[i][j]表示前i个数里任意组合后的最大公约数为j的个数。 则它的转移方程就是:dp[i+1][j]+=dp[i][j].如果dp[i][j]存在则与当前a[i+1]求一次最大公约数: dp[i+1][gcd(j,a[i])]+=dp[i][j]#includ原创 2016-04-03 20:33:51 · 716 阅读 · 0 评论 -
hdu1160 FatMouse's Speed
题意:求一个上升序列长度,和输出序号。这里就需要我们标记最初序号,用一个pre[]回溯回去。总之很水的dp。#include<bits/stdc++.h>using namespace std;struct node{ int w,v,t;}a[1000+10];bool cmp(node a,node b){ return a.w==b.w ? a.v>b.v : a原创 2016-04-02 10:52:12 · 324 阅读 · 0 评论 -
hdu1300
题意:每种等级的钻石价格不同,需求不同,如果要买这种需要额外加10个这个单价的手续费,可以用更高级的钻石代替。思路:开始想成背包问题,以为选择是每个每个,复杂度n^2*sum太高了,仔细想想 对于当 前这种钻石要么不买要买就买所有+10手续费,n^2,恩,就是这样!#include #include #include #include #include #include #原创 2015-12-27 16:00:25 · 625 阅读 · 0 评论 -
HDU2870 Largest Submatrix
题意:一个二维字符段,有w x,y,z,a,b,c,a,其中w 可以变成a,b,x可以变成b,c,等..问最大相同矩阵是多大思路:所有可能变成字母有三种,a,b,c,依次求最大矩阵,hdu1505,hdu1506 的增强。#includeusing namespace std;char M[1010][1010],nw[1010][1010];int s[1010][1010],l[原创 2015-12-18 11:16:20 · 297 阅读 · 0 评论 -
hdu 2059 龟兔赛跑
题意:龟兔赛跑,乌龟使用一个电动车,一条路上在不同距离处有一个充电站,每次充电需要消耗一定时间,并且他只能维持固定的距离,对于每个充电站,乌龟可以选择充或不充,求最优解。思路:开始想简单,只定义dp[i] 前i个充电站的最优解,然后第i个充电站,可以选择充或不充,发现这个转移的方程式在这题错误的,因为dp[i]的最优解不仅由dp[i-1]决定充或不充,和前面所有都有关,同时你不知道上一个使用的原创 2016-01-03 11:08:29 · 349 阅读 · 0 评论 -
hdu2845 Beans (%)
题意: 选择某个点后,这个点相邻两点和上下两行都不能选了,问最后选得数之和 最大可能。 开始没想到怎么是dp,是看别人的题解(心塞) 思路:先考虑每一行,由于相邻不可取,从左往右可以推出 转移方程 dp[i]=max(dp[i-2]+a[i],dop[i-1]); 把每一行最后一列的一竖列考虑成一行,是一样的规律,相邻的不能选,所以同理对每行也是这个转移方程。#include <f原创 2015-12-17 01:31:54 · 388 阅读 · 0 评论 -
poj3280 Cheapest Palindrome
Cheapest PalindromePOJ - 3280 时限: 2000MS 内存: 65536KB 64位IO格式: %I64d & %I64u已开启划词翻译问题描述Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate原创 2015-09-06 15:54:23 · 405 阅读 · 0 评论 -
poj3616 Milking time
题意:你有一头奶牛,你能够在一个时间段里挤奶。而且挤奶量也不同,每次挤奶完后要休息R时间,问你最大可以挤多少奶。 思路:比较水的dp,先对时间段排个序,定义dp[i]表示前i个时间段最大产奶量,相当于求最长上升子序列的感觉,满足就去最大,两个循环。 状态转移方程: if(node[i].s>=node[i-1].e)dp[i]=max(dp[i],dp[i-1]+node[i].t);#in原创 2015-09-06 15:42:45 · 364 阅读 · 0 评论 -
poj 2385 Apple Catching
题意: 两颗苹果树1,2 每一分会有树落下苹果,有人去接,但是来回两个树之间的次数是一定的,所以求出在最大次数时最多能接到多少苹果。 定义dp[i][j]表示第几分钟,经过j次来回,得到苹果的最多数。 状态方程也比较好推: dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]). 就是需要注意边界条件和一些细节处理,首先他在1棵树,dp[1][0]…等根据题目具体数据变化原创 2015-09-06 15:27:03 · 394 阅读 · 0 评论 -
poj 3176 Cow Bowling
题意:非常经典的dp,就是数塔,从上往下可以向右下走,和向下走,问最后得到的和最大值。 1.先找子问题,从第n层开始,到最后一层的最大值。确定符合无后效性,和最优子结构的特点。 2.然后确立状态dp[i][j]表示从第i层第j个开始到最后 的最大值。 3.然后在确立状态转移方程,dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+D[i][j]; 4.最后注意边界的原创 2015-09-06 13:48:23 · 318 阅读 · 0 评论 -
poj 2229 Sumsets
Sumsets POJ - 2229 时限: 2000MS 内存: 200000KB 64位IO格式: %I64d & %I64u已开启划词翻译问题描述 Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows u原创 2015-09-06 15:08:48 · 334 阅读 · 0 评论 -
百练2775 九度 1114
神奇的口袋 九度 - 1114 时限: 1000MS 内存: 32768KB 64位IO格式: %lld & %llu问题描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的原创 2015-09-04 21:14:28 · 594 阅读 · 0 评论 -
poj1088(记忆化搜索)
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;int M[110][110],dp[110][110],Max,n,m,Next[4][2]={{-1,0},{0,1},{1,0},{0,-1}};int dfs(int xx,int yy){ if(dp[原创 2015-07-15 21:30:29 · 604 阅读 · 0 评论 -
poj1458(LCS)
最最基础的最长公共子序列问题。 dp[i][j]表示状态是a串前i个和b串前j个的最长公共子序列个数。 所以很容易可以推导出 这个递推公式 : if(a[i]==b[j]) dp[i+1][j+1]=dp[i][j]+1; else dp[i+原创 2015-07-17 23:55:41 · 455 阅读 · 0 评论 -
hdu2018 (递归,记忆化递归)
很水的题,但好歹带我入门了一点动态规划?不,是递归。都没推出递推关系啦,可惜题目的数据太水啦,递归和保存已有的再递归 时间都看不出来差别。。。。。纯递归,怎么理解了:就是 你想啊 每下一刻奶牛的数量等于上一刻已有数量加上要增加的数量,而由题意每四秒后刚出生的小母牛就可以长大成能生出小母牛的大母牛,要增加的数量等于当前三秒前,因为当前的三秒前到当前就是四秒,就会增加一个能生小母牛的大母牛。#inclu原创 2015-07-17 16:16:31 · 3856 阅读 · 0 评论 -
poj2479 Maximum sum(最大子段和变形)
dp 最大子段和的变形求不相交的最大两个最大子段和,之前对最大子段和都喜欢这样写for(int i=0;i<n;i++){ sum+=a[i]; if(sum>0) res=max(res,sum); else sum=0;}也没有太多理解,写了这题发现最大子段和 原来定义dp[i] 是以i结尾的最大字段和的大小,最初转移方程代码是for(int i=0;i<原创 2015-12-10 17:18:23 · 539 阅读 · 0 评论 -
hdu1505 City Game
hdu1506 加强版 #include <fstream>#include <iostream>#include <string>#include <complex>#include <math.h>#include <set>#include <vector>#include <map>#include <queue>#include <stdio.h>#include原创 2015-12-13 21:48:56 · 342 阅读 · 0 评论 -
hrbust oj 2287 Bridge(最大上升子序列变形)
水题题意:给你每座桥的坐标和权值,问每座桥不能相交,但端点可以重复,问最多有多少座桥和在这种情况下最小花费。思路:对x,y排个序,就是求最大不递减子序列(端点可以取),稍微变形一下,在数量相同的桥里选择,费用最小的。详细看代码。#include #include #include #include #include #include #include #inclu原创 2015-12-14 16:14:12 · 435 阅读 · 0 评论 -
HDU2844:Coins
题意:有n个不同价值的硬币,每种有Mi个,问能组成多少个小于等于m的不同数字。 思路:典型多重部分和问题,时间复杂度O(n*W),给你n个不同大小的数,每种各Mi个,判断这些数字之间选出若干使它们的和存在之类的…. 搜题解发现很多人用多重背包,又写一遍,当做复习。#include <fstream>#include <iostream>#include <string>#include <原创 2015-12-17 00:09:36 · 370 阅读 · 0 评论 -
hdu 2577 How to Type (动态规划 入门好题)
题意:给你一个字符,有大写小写,你模拟键盘打字母的操作,可以shirft变换当前字母,可以开CapsLock灯,最后需要关掉。 因为有两个操作,需要两个维度表示状态转移。 定义:二维 dp[i ][2] ,前i个字母对应当前是 0,1操作 的最小操作。 所以有对应的状态转移方程:(见代码) 有一个细节写错了,dp[i][1]=min(…,dp[i-1][1]+2) 而不是3,这里意思是当前大原创 2015-12-16 21:12:13 · 611 阅读 · 0 评论 -
poj1072Coins
题意:N种货币价值,最高价值M,给你每个货币价值v和数量m,问能组出多少个不超过M的价值。思路:和《挑战》上 多重部分和 思路 一模一样 状态转移 dp[i+1][j]= m[i](dp[i][j]>=0) = -1(dp[i][j-v[i]]<=0||j<v[i]) = dp[i][j-v[i]]-1(dp[i][j-v[i]]>0)原创 2015-12-05 21:38:00 · 382 阅读 · 0 评论