![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Dp
文章平均质量分 52
宋紫恒
这个作者很懒,什么都没留下…
展开
-
1037: [ZJOI2008]生日聚会Party
o(╯□╰)o看了题解才会。。所以总结一下吧。。。这道题是dp或者说是递推。显然m,n要放到状态里,考虑直接用题目的答案来推答案。问题是要保证相差个数不超过k来进行转移,这里转移的时候是用前面的来推后面的。一开始想用f[i,j,k]表示i个男孩j个女孩男孩比女孩最多多k的方案数量,但是就无法记录女孩比男孩多的情况。设dp[i][j][x1][x2]表示i个男孩j个女孩男孩最原创 2013-12-01 16:20:31 · 858 阅读 · 0 评论 -
Tyvj 1172 自然数的拆分
将拆分问题转化成背包问题计数(有多少种方案装满)f[j]+=f[j-i]即可注意一个技巧 mod原创 2014-08-23 11:51:04 · 540 阅读 · 0 评论 -
hdu 4939 Stupid Tower Defense
题目链接:hdu 4939 Stupid Tower Defense题目大意:塔防游戏,一个长度为n的路,给定x,y,z和t。然后对应每个长度的位置可以放攻击塔,有三种:红塔:怪在红塔所单位长度内每秒受到x点伤害。绿塔:怪经过绿塔之后,每秒受到y点伤害。蓝塔:怪经过后每走一格的时间加上z。求最大伤害。解题思路:更具塔的性质,红塔肯定放在最后,所以有dp[i][j]表示到转载 2014-08-23 11:46:32 · 1017 阅读 · 0 评论 -
Uva 1534 - Taekwondo
为了防止后效性,应该原创 2014-08-23 14:03:24 · 472 阅读 · 0 评论 -
Tyvj 1124 花店橱窗
DP方程非常显然,记录一下主要注意一下细节原创 2014-08-24 14:34:12 · 426 阅读 · 0 评论 -
Tyvj 1076 数字三角形 要求走到最后mod 100最大
将mod 100的值加入到状态中,原创 2014-08-23 11:52:22 · 1967 阅读 · 0 评论 -
POJ 1160 Post Office Dp+中位数贪心
重点是要想到中位数贪心然后就变成比较经典的分组DP了,只需要原创 2014-08-24 18:59:40 · 500 阅读 · 0 评论 -
RQNOJ PID273 马棚问题
经典的分组DPf[i][j]=min{f[k][j-1]+w[k+1][i]}考虑清楚循环和原创 2014-08-24 20:07:49 · 562 阅读 · 0 评论 -
洛谷 P1846 游戏
给定两个正整数数列,你要用它们来做一个游戏:你需要对数列进行若干次操作,每一次操作,应选择两个正整数K1和K2 ,并删除第一个数列的最后K1个数,计算出它们的和S1;删除第二个数列的最后K2个数,计算出它们的和S2。这一次操作的得分就是(S2-K2 )*(S1-K1 )。两个数列应同时被清空,不允许一个数列空了,而另一个数列中还有数。游戏的总得分就是每一次操作的得分总和。求最小的总得分。原创 2014-02-05 19:30:41 · 875 阅读 · 1 评论 -
Wikioi 1258 & Vijos 1150 关路灯
一道经典的DP。。。。。比较详细的DP题解抄下来了=。=分析:上次我是DFS+剪枝AC的,但是教材说这题的正解是DP,所以我就思考了一下DP的思路,现在说一下思路吧:老张每次只有两种决策,关掉当前最左边没有关掉的灯或关掉最右边没有关掉的灯,也就是说老张关灯的状态一定是一条直线(“直线”这个词这个可能不太好理解),我举个例子吧:比如当前的街道上有n盏路灯,用0表示当前路灯开着,1表示当前原创 2014-02-02 13:09:39 · 759 阅读 · 0 评论 -
Uva10723 - Cyborg Genes
很显然,最短长度为原创 2014-08-26 18:17:51 · 441 阅读 · 0 评论 -
Tyvj 1125
显然需要排序。对于第i个筷子,如果我们将它选入,那么必将和第i-1个筷子配对,这样平方差是最小的dp[i][j]表示前i个筷子,已经选择了j个筷子的最小的代价dp[i][j]=min(dp[i-1][j],dp[i-2][j-2]+sqr(a[i]-a[i-1]))初始化条件dp=maxint;dp[0][0]=0;注意j的枚举。#include#include原创 2014-08-23 11:44:09 · 407 阅读 · 0 评论 -
Vijos 1144 小胖守皇宫
经典题不解释。。(貌似代码写的很挫)#include#include #include#define INTMAX 2000000000using namespace std;int f[2000][3],b[2000][2000],c[2000],inf[2000];int dp(int i,int j){ int ans=0; if(f[i原创 2014-02-05 21:10:05 · 1256 阅读 · 0 评论 -
2431: [HAOI2009]逆序对数列
考虑直接把答案作为状态进行DP(递推)f[i][j]表示1~i产生j个逆序对数的可能有多少种。对于第i个数,显然他比1~i之间的数都要大,所以容易得出状态转移方程:f[i][j]=sum(f[i-1][k])然后就好了。。上代码(好短)#includeusing namespace std;const int MOD=10000;int f[2000][2000];原创 2013-12-07 12:38:05 · 1145 阅读 · 0 评论 -
1978: [BeiJing2010]取数游戏 game
类似最长上升子序列的做法,只不过有个要求就是gcd必须要>l,这样根号n枚举因数,然后dpdp[i]表示以i作为最大公因数可以选的数的最多个数 满足gcd>l才更新dp#include#includeusing namespace std;int dp[2000000],a[100000];int main(){ int n,l,ans=0,k; scanf(原创 2013-12-01 15:34:03 · 907 阅读 · 0 评论 -
BZOJ 1786 配对Pair
注意到-1的位置所填的数一定是不下降的,而且k的值非常的小,所以考虑DP。设dp[i][j]表示在前i个-1的位置上,第i个-1的位置上填数字j所产生的最少逆序对数目,那么求出来之后只需要加上开始时的逆序对数即可。需要预处理出来两个数组,big[i][j]和small[i][j]分别表示,在第i个数前面并且比数字j大的数字的个数,在第i个数后面并且比j小的数字的个数,这样的话dp[i]原创 2013-11-26 22:32:02 · 919 阅读 · 0 评论 -
2748: [HAOI2012]音量调节
很朴素的DP。。竟然是省选题。。。。。。直接上代码:#includeusing namespace std;bool dp[100][10000];int c[1000];int main(){ int n,s,maxlevel; scanf("%d%d%d",&n,&s,&maxlevel); for(int i=1;i<=n;i++)原创 2013-12-07 07:36:36 · 1009 阅读 · 0 评论 -
1996: [Hnoi2010]chorus 合唱队
区间DP: f[i][j][0]表示目标队形中[i,j]这一段最左边(i)是刚放上去的数的方案数 f[i][j][1]表示目标队形中[i,j]这一段最右边(j)是刚放上去的数的方案数 转移是十分显然的。 注意一下初始化:f[i][i+1][0]=f[i][i+1][1]=1 (a[i]f[i][i+1][0]=f[i][i+1][1]=0 (a[i]>原创 2013-12-08 08:19:18 · 642 阅读 · 0 评论 -
Vijos P1006 晴天小猪历险记
背景 Background 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳、勇敢、善良、团结…… 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物。所以晴天小猪自告奋勇,要去采取这种药草。于是,晴天小猪的传奇故事便由此展开……描述 Description 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知转载 2014-01-27 19:19:38 · 1487 阅读 · 0 评论 -
Wikioi 2572 路面修整
http://www.wikioi.com/problem/2572/赶脚挺不错的一道DP。。。。抄过来。思路分析:显然(?)修整后的路面一定是原路面的某个值。创建新数组c等于原数组,然后将c排序,f[i][j]表示原数组前i个数变为单调上升,且i是c中的第j个数。f[i][j]=min(f[i-1][k]+abs(a[i]-c[j])); 但是还可以优化,用一个g[i原创 2014-01-28 21:26:45 · 861 阅读 · 0 评论 -
Wikioi 1261 龙王的礼物
http://www.wikioi.com/problem/1261/继续搬运。。。用f[i][j]表示前j个数,取出来一些数,他们的和mod n为i时,这个和的最大值.num[i][j]表示这个最大值的情况下,取的最少的块数.a为原数组,则f[i][j]=max(f[i][j-1], f[ ((i-a[j])%n+n)%n ] + a[j])(分别表示不取此数与取此数),当括号内二者相同原创 2014-01-28 21:33:53 · 714 阅读 · 0 评论 -
Vijos 1061
题目中的按升序排列启示了我们DP的顺序,我们先考虑按升序DP,这时会发现决策的时候第i个必定是站在中间的,对答案不产生影响,故无法转移,这样就可以考虑倒着DP,从后往前进行DP。决策的时候需要注意,并不是一个一个的决策,而是两个两个的决策,即每次决策两个最矮的人,这样就容易转移。(所以转移的时候是f[i-2]而不是f[i-3],因为选了i和i-1在1~i-2中剩下的任何一个人都比他们高,不产生影响原创 2014-02-02 10:01:07 · 575 阅读 · 0 评论 -
Vijos 1059
背包问题,水过。。。。。#include#include#includebool dp[200][100000];int a[200][200]; int n,maxh=0;using namespace std;void work(int m){ for(int i=1;i<=a[m][0];i++) for(int j=maxh;j>=dp[m][i];j--)原创 2014-02-01 19:31:20 · 579 阅读 · 0 评论 -
TYVJ 1186 旅行商问题简化版
两种思考方式。第一种是顺推:原创 2014-08-17 09:22:31 · 1207 阅读 · 0 评论