DP
文章平均质量分 67
SeasonJoe
这个作者很懒,什么都没留下…
展开
-
PAT1068 Find More Coins (30)(DP)
题意:给出n枚钱币,要求买价值为m的物品,要求输出具体所用的钱币,如有多种情况输出字典序最小的情况。思路:这题就是01背包的变种,状态转移方程很好写:dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+c[i])主要难点在于怎么处理多种情况最后输出,基本思路是一开始将钱币按从大到小排序,在状态转移的过程中用hash[i][j]保存是否选取了当前钱币i,这样最后对dp[n...原创 2018-05-31 14:41:51 · 216 阅读 · 0 评论 -
HDU1160 FatMouse's Speed(DP+路径记录)
题意:输入一组小鼠的体重和速度,要求输出体重从小到大而速度从大到小的数目最多的小鼠的数量和具体序号。要点:简单的最长上升子序列,只要先排序再DP即可,就是要记录一下路径最后递归输出就行。174476802016-07-06 14:10:34Accepted11600MS1732K958 BC++seasonal原创 2016-07-06 14:43:37 · 387 阅读 · 0 评论 -
POJ3181 Dollar Dayz(DP)
题意:将N分解为为1~K的因子,求有几种分解方法。要点:这题挺难,用dp[n][m]表示n分解后最大因子为m的分解方法总和。可以写出状态转移方程dp[i][j]=dp[i][j-1]+dp[i-j][j-1]+……,可以这么理解:dp[i][j]可以由最大因子为j-1的通过i减去j的整数倍来得到。还可以进一步优化,这题还要用到大数的加法,用两个数组分别存储低位和高位可以做到,但是我觉得原创 2016-07-05 17:20:40 · 325 阅读 · 0 评论 -
POJ3616 Milking Time(DP:最大子段和)
题意:奶牛产奶,一共n长的时间,可以有m个时间段,每个时间段对应一个产奶量,一个时间段后要休息r时间,求最大产奶量。要点:就是一个最大子段和的变形,先将时间段从开始排序,可以写出状态转移方程为:if (time[i].x >= time[j].y + r) dp[i] = max(dp[j] + time[i].w, dp[i])边界条件就是dp[i]=time[i]原创 2016-07-04 17:22:08 · 348 阅读 · 0 评论 -
POJ 1080 Human Gene Functions(DP:LCS)
题意:人类基因有两条,现在给出两个字符串,有长有短,可以在字符串中插入空格,要求对照表使两个字符串得出的相似值最大。要点:是LCS的变形,用dp[i][j]存储第一个字符串前i个字符与第二个字符串前j个字符的相似值的最大值,可以这么理解,要么就两个字符串都不加空格,要么其中一个加一个不加。这样可以写出状态转移方程为:dp[i][j]=max(dp[i - 1][j - 1] + mat原创 2016-07-03 16:50:56 · 318 阅读 · 0 评论 -
HDU1421 搬寝室(DP)
题意:中文题不解释。要点:要在n个中选k对,使每两个之差的平方和最小,可以用dp[i][j]来表示i个数中选了j对的最小值,以当前的第i个数来判断,如果不选这个数,说明就是前一个数的值,dp[i][j]=dp[i-1][j];如果选这个数,说明它前面的数也要被选,dp[i][j]=dp[i-2][j-1]+(val[i]-val[i-1])^2。状态转移方程就是:dp[i][j] =原创 2016-07-02 11:38:10 · 388 阅读 · 0 评论 -
UVa1625 Color Length(DP)
题意:看白书要点:白书上的题,还是有些难度的,具体分析看书吧,难点就是要求res[i][j]。#include#include#include#includeusing namespace std;#define maxn 5005#define inf 0x3f3f3f3fchar str1[maxn], str2[maxn];int len1, len2原创 2016-07-13 12:26:22 · 324 阅读 · 0 评论 -
HDU2571 命运(DP)
题意:中文题要点:期末考试考完了,继续刷题。这题就是个简单的DP,多决策分析,可以向右移一格,向下移一格,或是向右移动到当前列的倍数。状态转移方程很容易写出来是:dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i][j/k]),注意这题有负数,边界条件设为一个较小的负数。174164162016-07-01 13:44:2原创 2016-07-01 14:03:27 · 395 阅读 · 0 评论 -
POJ3267 The Cow Lexicon(DP)
题意:有一个字符串以及有很多单词的字典,求在字符串中删除最少的单词数,使字符串和字典中的单词完全匹配。要点:这题我是没想出来,看了网上大神的解题报告。重点就是用dp[i]表示从i 到字符串末尾n要删除的最小数目,后面再分为能匹配和不能匹配进行状态转移。参考博客:点击打开链接15695630Seasonal3267Accepted196K原创 2016-07-10 14:29:14 · 457 阅读 · 0 评论 -
POJ3311 Hie with the Pie(DP:TSP问题)
题意:要到n个城市送披萨,每个城市只能经过一次,最后要回到原点,求最短路径。要点:经典的TSP问题,从0出发找到一条回路回到0,这就意味着可以回溯到前面的城市重新出发,这样就比较难。基本上可以想到先用Floyd算法求出每两个点的最短路径,然后就是DP,定义一个d[i][s]数组,表示当前在第i个城市,已经经过了s集合中的城市(包括i),s用二进制存储。这样可以写出状态转移方程:d[原创 2016-06-05 15:49:51 · 478 阅读 · 0 评论 -
例题9-6 UVa11400 Lighting System Design(DP)
题意:看白书要点:其他的白书上讲的比较清楚了,有点难以理解的是原创 2016-05-21 21:33:45 · 481 阅读 · 0 评论 -
例题9-11 UVa1331 Minimax Triangulation(DP:最优三角剖分)
题意:看白书要点:基本的三角剖分题,但要注意三个点:1.已知三角形三个顶点的坐标,可用行列式求面积,则S=(1/2)*(下面行列式) |x1 y1 1| |x2 y2 1| |x3 y3 1| S=(1/2)*(x1y2*1+x2y3*1+x3y1*1-x1y3*1-x2y1*1-x3y2*1) 2.这题没有说多边形一定是凸多边形,所以要考虑凹多边形的情况,原创 2016-05-20 22:44:03 · 964 阅读 · 0 评论 -
DP——最优矩阵链乘&&最优三角剖分
一个n*m的矩阵乘一个m*p的矩阵等于一个n*p的矩阵,运算量为mnp,现在有一组n个矩阵组成的序列,求运算量的最小值。这是DP中的最优矩阵链乘问题,我们可以这么理解:用一个d[i][j]来存储第i个矩阵链乘到第j个矩阵的最优解,那么现在进行DP化,也就是找它的子解。我们把这组序列从中间不同位置裂开,记这个位置为k,那么不难得到d[i][j]=d[i][k]+d[k+1][j]+p[i-1]*原创 2016-05-18 21:31:21 · 651 阅读 · 0 评论 -
POJ1065 Wooden Sticks(贪心||DP)
题意:一些有长度l和重量w的木棍要装在机器上,如果前一个木棍长度和重量均小于等于当前木棍,装上机器不耗时,否则时间+1,问全装上最少时间。要点:可以用贪心或DP,贪心就是先按长度从小到大排好,再根据重量,用一个d数组标记是否用过,从一根木棍出发,往后找重量大于等于它的木棍,将它的d标记为1,再以这个新木棍为起点再往后找,遍历一遍后再从d为0的木棍出发,看能遍历几次就是最小时间。原创 2016-06-02 16:03:16 · 436 阅读 · 0 评论 -
POJ1351 Number of Locks(DP:记忆化搜索)
题意:锁上有n个槽,槽的高度可以是1~4,现在要求锁上至少有两个相邻的槽之间的高度差为3并且至少有3种不同高度的槽,问有几种排列方式要点:这题应该是可以通过排列组合简单得出结论的,但是我推不出来,看了一下网上的做法都是用DP记忆化搜索,思路是用dp[i][now][j][m]存储有多少种方案,i表示第i个槽,now表示当前槽的高度,j表示是否达到相邻高度差为3,达到了则为1,m为有m种原创 2016-06-01 22:03:26 · 513 阅读 · 0 评论 -
例题9-9 UVa10003 Cutting Sticks(DP:矩阵链乘)
题意:看白书要点:明显是类似于矩阵连乘问题,用d[i][j]标记i到j中的最优费用,从中间一点k处截成两半,可以写出状态转移方程为d[i][j] = min(d[i][j], d[i][k] + d[k][j] + pos[j] - pos[i]),不难看出这实际是一个区间DP问题,通过j-i小区间不断递增进行DP,注意这里i和j不用写成0~len,因为d[i][j]只是起到一个存储状原创 2016-05-19 18:08:30 · 404 阅读 · 0 评论 -
最优二叉搜索树
最优二叉搜索树,又称霍夫曼树,是一种使查找时间尽可能小的算法。已知一个节点的出现概率以及它的深度,它的总查找时间就是深度*概率,现在希望经过排列使所有节点的查找时间最小。基本思路是区间dp,两个边界中间任选一个根节点,拆分成两个子树。下面是算法导论上关于一个期望搜索的实现。#include#includeusing namespace std;const int n = 5;原创 2016-08-08 21:31:58 · 801 阅读 · 0 评论 -
POJ2184 Cow Exhibition(DP:变种01背包)
题意:一群奶牛分别有s和f两个值,要求选出一些奶牛使s与f的和最大并且s和f分别的和不能为负数。要点:用dp[i]=j表示当s的和为i时f的和为j,这样最后只要求dp[i]+i的最大值即可。注意这题因为有负数,所以引入一个偏移量。这里01背包是用一维表示的,所以要根据s[i]的正负分别处理,遍历是倒序还是正序主要考虑子结构不能被先更新。15913695S原创 2016-08-07 21:15:28 · 456 阅读 · 6 评论 -
PAT1045. Favorite Color Stripe (30)(dp)
题意:给出m中颜色作为喜欢的颜色(同时也给出顺序),然后给出一串长度为L的颜色序列,现在要去掉这个序列中的不喜欢的颜色,然后求剩下序列的一个子序列,使得这个子序列表示的颜色顺序符合自己喜欢的颜色的顺序,不一定要所有喜欢的颜色都出现思路:就是个简单的dp,一遍过,不过我dp不怎么样所以记录一下:用dp[i][j]表示序列中第i个数并且喜欢的颜色在顺序中排j的最大值。当num[i]是喜欢的颜色时,dp...原创 2018-04-29 20:41:22 · 165 阅读 · 0 评论 -
PAT1040. Longest Symmetric String (25)(回文串:dp)
题意:给出一个字符串,求出其中最大的回文串字数要点:这题比较好的办法是用dp做:dp[i][j]表示从s[i]到s[j]是否为回文串,用0、1区分s[i]=s[j]时,dp[i][j]=dp[i+1][j-1];s[i]!=s[j]时,dp[i][j]=0边界:dp[i][i]=1,dp[i][i+1]=(s[i]==s[i+1])?1:0因为i、j如果从小到大的顺序来枚举的话,无法保证更新dp[...原创 2018-04-24 22:01:02 · 220 阅读 · 0 评论 -
PAT1007 Maximum Subsequence Sum (25)(最大连续和)
这题没什么好说的就是一个最大连续和的裸题,只要掌握dp[i]=max(dp[i-1],0)+num[i]即可,记录一下主要是因为我自己写的时候边界条件没处理好,也就是dp[i-1]这里对于0的处理,所以尽量少用dp[i-1]这种形式,用一个变量存就可以了。/*自己写的不太好*/#include<string>#include<cstdlib>#include<v...原创 2018-03-22 19:32:08 · 159 阅读 · 0 评论 -
UVa11324 The Largest Clique(强连通分量+DP)
题意:看白书要点:求出强连通分量后缩成点,内部点数作为权,进行DAG的DP。#include#include#include#include#includeusing namespace std;const int maxn=1010;vector g[maxn],map[maxn];int dfn[maxn],lowlink[maxn],sccno[maxn],d原创 2016-09-15 19:44:24 · 336 阅读 · 0 评论 -
codeforces712D Memory and Scores(前缀和优化dp)
题意:两个人玩取数游戏,第一个人分数一开始是a,第二个分数一开始是b,接下来t轮,每轮两人都选择一个[-k,k]范围内的整数,加到自己的分数里,求有多少种情况使得t轮结束后a的分数比b高。 (1 ≤ a, b ≤ 100, 1 ≤ k ≤ 1000, 1 ≤ t ≤ 100)要点:一开始没想到是dp,实际上可以用dp[i][j]表示第i轮比一开始多得到j分的方案数,所以一开始a,b原创 2016-11-25 08:23:32 · 663 阅读 · 0 评论 -
HDU3401 Trade(单调队列优化DP)
最近做CF的时候遇到单调队列优化DP的问题,看了一下网上这种题也很少,而且都很难理解,下面是两个解释的比较好的博客:单调队列优化DP的基本思路:点击打开链接两道例题详解:点击打开链接下面讲一下我自己对单调队列优化dp的理解,首先不是所有dp都可以使用单调队列优化的,只有形如 dp[i]=max/min (f[k]) + g[i] (k还是挺难理解的,现在水平可能不够吧,还是多做题。原创 2016-11-19 15:06:29 · 395 阅读 · 0 评论 -
codefores741B Arpa's weak amphitheater and Mehrdad's valuable Hoses(并查集+背包)
题意:给出一些女孩的体重和美貌程度,这些女孩是按照组在一起的,要么选一整个组,要么只能选组里的一个,最后求总重量为W的女孩最大美貌程度要求:这一看就是并查集+背包,主要是这个选择的问题,用背包时按组数遍历,每次状态转移一整个组或遍历整个组转移其中一个女孩,这里面的状态转移一开始没怎么搞清楚。#include#include#include#include#include#原创 2016-12-10 12:04:35 · 755 阅读 · 0 评论 -
codeforces721C Journey(DP)
题意:给出一个图,问从点1到n,在总时间为T的情况下最多能经过多少城市?要点:一看就知道是DAG里的DP,直接递推比较难写,用记忆化搜索比较方便,基本思路就是用dp[i][j]存储从i开始经过j个城市所需最少时间,最后找出时间小于等于T的j的最大值即可。#include#include#include#include#includeusing namespace std;原创 2016-11-14 22:00:11 · 400 阅读 · 0 评论 -
【?】codeforces721E Road to Home(DP+单调队列)
转换关系搞清楚了,但是关于那个单调性来处理DP的地方,还是不明白,应该是单调队列优化DP这个点不会,补一下代码,先学一下单调队列优化DP,参考博客:点击打开链接#include#include#includeusing namespace std;const int maxn = 100005;int f[maxn], g[maxn];int main(){ int l,原创 2016-11-17 15:59:11 · 453 阅读 · 0 评论 -
codeforces731E Funny Game(DP)
现在主要是以cf上比赛为主了,以后除了我觉得很有必要总结一下的题目,不会每道题都记录在博客上了。这题是一道DP,看起来很像博弈论,但是其中的思想还是有点新颖的。题意:给出一系列数,有两个人,每次从这些数的最左边拿走k个数,范围为2~m。特别之处在于,拿走后会把拿走的数的和作为一个新的数放在最左边,要求两个人拿走数之差的最大值。要点:看起来很像博弈论,但是其实不是,因为每次拿走后都会原创 2016-10-20 20:17:30 · 618 阅读 · 0 评论 -
例题29 UVa11825 Hackers' Crackdown(DP:子集)
题意:看白书二P67要点:这题还是有点难度的,思维上比较难想到,具体解析看白书吧。#include#include#includeusing namespace std;const int N = 1 << 20;int s[N],p[N],cover[N],f[N];int main(){ int n; int i,kase=1; while (~scanf原创 2016-10-13 19:14:17 · 300 阅读 · 0 评论 -
Codeforces Round #369 (Div. 2)
这比赛比较坑啊,看了一下A题过了7000+人,B题直接只剩2000+人。这套题的B题非常坑,很多陷阱。A:水题B:这题就是一个幻方,但是非常坑,有这么几个坑点:1.如果n==1,随便输出一个数即可,但不能是0;2.算出的答案必须是正整数,#include#include#include#includeusing namespace std;long long ans;原创 2016-09-18 08:55:36 · 266 阅读 · 0 评论 -
例题27 UVa10635 Prince and Princess(DP:LIS的nlogn算法)
题意:看白书要点:这题本来应该是LCS,但因为时间的要求,可以转化为LIS,而且还得用nlogn的算法,基本思路就是用b数组来存储当前b的值在a数组中对应的位置。LIS的nlogn算法的思路就是,每次用g来存储,并每次在其中进行二分查找,注意这里每次更新是不会改变LIS的性质的,最后g的结果不是所需的LIS,这里要注意一下。#include#include#include#i原创 2016-10-10 22:30:48 · 408 阅读 · 0 评论 -
HDU1028 Ignatius and the Princess III(整数拆分:母函数||DP)
题意:给出一个值n,问有几种不同的拆分方法。要点:可以用母函数或DP来做,这里说一下母函数,基本思路是:写成(1+x^2+x^3+x^4……x^n)*(1+x^2+x^4+……)*(1+x^3+x^6+……)……这样,然后利用循环从每个括号开始算起,用c1存储前一次算出的所有指数对应的系数,c2暂存算上当前括号的对应系数,最后c1[n]就是答案。母函数:1828原创 2016-09-18 10:35:39 · 506 阅读 · 0 评论 -
例题9-7 UVa11400 Partitioning by Palindromes(DP+回文串)
题意:看白书要点:回文串处理,传递边界,从左边界枚举到中心,如果出现不相等的说明不是回文串,否则为回文串。DP:以d[i]存储第i个字符前划分成的回文串的个数的最小值,如果第i个字符和前面第j个字符之间的为回文串,那么d[i]=d[j-1]+1。因此状态转移方程就是d[i]=max(d[i],d[j-1]+1)。边界值d[0]=0,因为取最小值,一开始d数组赋值为一个比较大的数。原创 2016-05-18 16:19:53 · 471 阅读 · 0 评论 -
POJ3342 Party at Hali-Bula(树型DP求最大独立集+唯一解判断)
题意:公司参加聚会,要求员工不能和他的上司同时参加,求最多能参加几个人并且判断解是否唯一。要点:树型DP的经典题,用dp[u][1]表示选取u的最大值,dp[u][0]表示不选取u的最大值,容易得到状态转移方程为dp[u][1] += dp[v][0]和dp[u][0] += max(dp[v][1], dp[v][0]),可以看到如果dp[u][0]>dp[u][1]时,dp[v][原创 2016-05-31 09:23:47 · 547 阅读 · 0 评论 -
例题9-12 UVa12186 Another Crisis(树型DP)
题意:看白书要点:白书上写的还是很清楚的,通过递归进行动态规划,vector还真是好用,暑假的时候学一下。#include#include#include#include#include#define maxn 100005using namespace std;int n, T;vector son[maxn];int dp(int x){ if原创 2016-05-29 10:37:21 · 406 阅读 · 0 评论 -
背包问题
参考文献:背包九讲一:01背包问题最基础的背包问题,关键是每个物品只要一件,基本的状态转移方程就是:f[i][v]=max{f[i-1][v],f[i-1][v-w[i]]+v[i]} 有个需要注意的地方是:要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价原创 2016-03-11 15:46:29 · 450 阅读 · 0 评论 -
最长公共子序列和最长公共子串
也是DP中的经典问题,最长公共子序列(LCS)不用连续而最长公共子串要连续。 最长公共子序列: 一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。 最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。 可以用两种算法:递归;DP算法一:递归 代码为:#include<stdio.h>#include<string.h>ch原创 2015-11-27 20:55:45 · 506 阅读 · 0 评论 -
POJ1664 放苹果(递归)
题意:中文题,把m个苹果放入n个相同的盘子,盘子中可以不放苹果,问有几种方法要点:一开始我还以为是数学题,这不是组合概率问题吗?后来看网上的解释原来是递归:用f(m)(n) 记录有几种方法:1.m=1||n=1时都只有一种,f(m)(n)=12.m3.m=n时,有两种方式,第一种是每个盘子都放,只有全为1一种可能,第二种是至少一个盘子是空的,f(m)(n)=1+f(m)原创 2016-01-30 16:30:43 · 482 阅读 · 0 评论 -
POJ1163 DP水题
水题,数字三角形,最近dp做的真不怎么样,找点信心代码如下:#include#include#include#includeusing namespace std;int main(){ int a[150][150], dp[150][150]; int n; while (scanf("%d", &n) != EOF) { int i, j; for (i原创 2015-12-27 11:38:40 · 368 阅读 · 0 评论 -
POJ1160 邮局问题
题意:m个村庄排在同一直线上,在之中建立n个邮局,要求这些村庄到最近的邮局之和最小要点:这道题挺难的,思路比较难想到不说还比较难理清首先:在第a个和第b个村庄中建1个邮局的邮费最小方案应该是建在第(a+b)/2个村庄里,说实在的这个我一开始都不知道。然后问题就可以拆成DP问题:在前k个村庄中建i-1个邮局加在第k+1到第j个村庄中建1个邮局,这就是一个典型的DP问题了。状态转移原创 2015-12-27 10:39:47 · 1489 阅读 · 0 评论