动态规划
文章平均质量分 54
捡石子的小孩
这个作者很懒,什么都没留下…
展开
-
poj1185 炮兵阵地 状态压缩dp
本题的行和列的范围相差很多,因此很容易想到要用状态压缩。对于(i,j)位置,影响它能否放炮兵的因素有两个:1.是否是平地 2.(i-1,j)或(i-2,j)处是否放有炮兵。至于与它同行的就不用考虑了,因为在设计算法是可以很容易的避免同行的相互攻击。所以我们必须要记录i-1行和i-2行的放置炮兵的情况,首先很容易想到把第i-1行和i-2行分别按二进制位压缩,但很快就把这种想法给否定了,因为这样做的话原创 2012-09-26 20:59:01 · 708 阅读 · 0 评论 -
hdu4521 加强版LIS
这道题的数据范围为1但这题又不是单纯的LIS,因为它加了一个限制条件。算法思想:此题要用到一个附加数组c[i],其中c[i]表示长度为i的子序列的最小尾部,但因为此题有个限制条件:相邻两个数字的距离大于d,因此在读第i个元素时,c数组其实还只更新到i-d,这也就是处理此题的技巧了。 dp[i]:以第i号元素结尾的最长子序列c[i]:长度为i的子序列的最小尾部a[i]:集合元原创 2013-03-31 14:08:45 · 1043 阅读 · 0 评论 -
hdu3466 Proud Merchants 变形的0-1背包
这道题看了解题报告后才懂的,第一次遇到这种变形的背包,不过真是很难想到要先按照Q-P排序。。。下面说一下我对本题的理解。 首先讲一下暴力解决,很显然我们可以用枚举的方法,对每个物品都有选与不选两种决策。但即使暴力也存在一个问题,比如对 3 5 6,5 10 5这两个物品,如果我们的决策是两个都不选或者是只选其中一个,显然没什么问题,但如果我们要是两个都选的话,按照之前这个顺序有m>原创 2013-01-18 14:03:13 · 954 阅读 · 0 评论 -
poj1837 Balance
这道题是一个背包的变形。把每个砝码看作一个物品,每个物品可以放在任意一个挂钩上,则对于每个物品,它的价值只会在它所有可能出现的价值中选一个(且必须选一个)。但这样处理后,还存在一个问题,因为价值可能为负,所以n个物品最后可能会产生一个负价值,而背包的体积肯定为正,估算一下后我们知道,可能长生的最大负加值为-15*20*25=-7500,所以我们可以把初始平衡位置定为7500,也可理解为把n的物品长原创 2012-11-30 21:09:10 · 698 阅读 · 0 评论 -
Check the difficulty of problems poj2151
一道高中就应该掌握的概率题,却想了很久而不得其解。不是因为求概率难,而是不知道怎么用算法实现。没想到dp可以如此轻松的解决刚开始思想上的种种难关,dp真的很强大啊。(ps:这道题很好,值得认真的做一下!) #include#includeusing namespace std;double team[1001][31];double dp[1001][31][31];/原创 2012-11-15 22:10:24 · 744 阅读 · 0 评论 -
poj2411 Mondriaan's Dream 状态压缩dp
首先来说一下此题的动归思想。可以模拟一下我们手放的过程,刚开始时棋盘为空,所以我们就从第一行开始铺,当第一行铺满后,再从第二行开始铺(注意此时第二行有些方格可能已经被占了),然后一直进去…… 对于当前行,每个方格都有两种铺法,因此这就影响到了当前行铺完后下一行的状态。如果我们选取第i行各方格的初始状态作为第i行的状态,那么从第i行到第i+1行的状态转移也就很清楚了。接下来就是原创 2012-09-25 20:32:58 · 1240 阅读 · 0 评论 -
poj1390 Blocks
此题为区间动态规划,但此题的状态转移真的非常巧妙。首先将木块按颜色分成段,每一段的颜色相同。dp[i][j][k]表示消去[i,j]段得到的最大分数,其中k表示第j段后面与它颜色相同的段的长度,且这一段已经缚到第j段了。现在来考虑第j段,它要么单独消去,要么与[i,j-1]中与它颜色相同的段一起消去。所以状态转移方程:dp[i][j][k]=max(dp[i][j-1]+(a[j]+k)*原创 2012-09-24 21:14:56 · 770 阅读 · 0 评论 -
hdu4283 You Are the One
刚开始没去深入挖掘题目的意思,因此一直在纠结题目中提到的黑屋子,其实仔细一想后,黑屋子只不过是为了改变出场顺序而已,所以重点又回到了原来给定的那个顺序上。想通这一点后,本题也就不难设计出状态了。 dp(i,j)表是区间[i.j]中的人得到的最小不高兴度,现在来分析第i个人,在他之前可以有k个人已经走上了舞台(此即黑屋子的巧妙用处),则状态转移方程为:dp(i,j)=min( dp(原创 2012-09-23 19:07:58 · 713 阅读 · 0 评论 -
积木游戏 vijos
题目要求“第K堆中任意一块积木的编号要大于第K+1堆中任意一块积木的编号”,为了与后面的保持一致,我们把它改为“小于后面一堆”,这样改动显然不会影响最终的解,接下来就是状态设计了。对于第j快积木,假设当前已经有i堆积木了,那么它有三种决策,不放或另起一堆或放在当前堆的最上面,由题目限制可知,不可能放在第i堆前面的堆中。对于放在当前堆的这一决策,当然还要考虑能否放上去,也就是我们还要知道第i堆最上面原创 2012-09-22 20:15:28 · 1008 阅读 · 0 评论 -
hdu2517棋盘分割
先对均方差的公式化简,可发现只需求出sum(x[i]^2)的最小值,其中x[i]为一个矩形棋盘的总分。很容易就想到动态规划了,dp[x1][y1][x2][y2][k]表示一个左上坐标为(x1,y1),右下坐标为(x2,y2)的矩形棋盘切割k次得到的最小sum(x[i]^2),则状态转移很明显,对于一个给定的矩形棋盘,只有两种切割方式,要么横切,要么纵切。转态转移方程:dp[x1][y原创 2012-09-19 13:24:48 · 919 阅读 · 0 评论 -
决斗 RQNOJ
先来看第x个人能否最终获胜,可以将x拆成两个点,这样就将环变成了链,接下来只需知道x能否与自己相遇,若能相遇则说明能获胜。因此可以用dp[i][j]表示第i个人与第j个人能否相遇,若能则为1,否则为0。现在若知道dp[i][k]=dp[k][j]=1,i所以转移方程也就出来了。还有就是要注意某些细节,具体看程序实现。#include#includeusing namespace原创 2012-09-20 08:55:16 · 588 阅读 · 0 评论 -
舞蹈家怀特先生 tyvj1211
动态规划要求状态表示满足无后效性,若以第i步作为当前状态,显然不满足无后效性,因为作哪种决策取决于当前双脚的状态,而这是未知的。因此选当前双脚的位置作为当前状态能满足无后效性。那么此题很明显是一个多状态决策问题了。用dp[i][j][k]表示从当前状态(左脚的位置为i,右脚的位置为j,已跳了k步)到终状态消耗的最小体力。dp[i][j][k]=min(dp[i][a[k+1]][k+1]+原创 2012-09-19 17:25:59 · 1225 阅读 · 0 评论 -
poj1141 Brackets Sequence
看到这道题,第一感觉就是区间dp,但重要的就是如何状态转移了。对于给定的串S,可分以下三种情况讨论:1.S形如(S')或[S'],则只要把S'变成规则的就行;2.S形如(S'则只需将S'变成规则的,然后在右边添上')';3.对于S形如S')或S']或[S',方法同上。对于任何一个串S,都可将它分成两部分S1,S2,若S1,S2规则,则S也规则。说到这里,状态转移方程基本原创 2012-09-19 16:31:36 · 622 阅读 · 0 评论 -
hdu1074 Doing Homework (状态压缩dp)
本题数据范围较小,但暴力枚举的话肯定超时,因为最坏情况将要枚举15!种情况,因此只有采取dp。本题有点类似于经典的数塔模型,此处用已完成的课程表示当前的状态,对于某门课程,0表示还未完成,1表示已完成,采用按位压缩的方式表示出所有的情况,因此最多有1//状态压缩dp,类似于数塔模型。//对应位上,1表示已完成该课程,0表示未完成 //如001表示课程1已完成,而2,3未完成 #inc原创 2012-09-19 12:06:27 · 802 阅读 · 0 评论 -
zoj3682 背包
刚开始看这题,根本没想到是背包,看来对背包的理解还不够透彻/*背包问题:1.因为题目中提到所有广场所能容纳的人数刚好等于总人数,所以只要 安排好其中一方粉丝(a),另一方就唯一确定了。2.取s=min(s1,s2),则可以把s看做背包体积,每个广场所能容纳的人数看做 每个物品的体积3.每个广场有三种选择方式,全部放a,不放a,放一半a(前提是总数为偶数)*/#include原创 2013-03-17 21:09:57 · 1033 阅读 · 0 评论