Dp
Hanks_o
一名。
展开
-
bzoj1026: [SCOI2009]windy数(Dp)
题目传送门 我以前好像做过这道题。 很明显数据范围已经透露了做法。。 最朴素做法O(n*m)。n是个数,m是位数。 必定超时咯。其实我并不知道这题是不是Dp,只是一个预处理的小Dp而已。 用f[i][j]表示一共i位数,最高位填j。小于等于这个数的合法方案数 方程就太好转移了。不详细说明了。for(int i=2;i<=20;i++) for(int j=0;j<=9;j原创 2017-09-17 15:12:40 · 346 阅读 · 0 评论 -
bzoj1057: [ZJOI2007]棋盘制作(Dp)
题目传送门 这个东西叫悬线法解法: 又是学肉dalao做题系列。 悬线法太强啦orz。。 就是预处理出每个位置向左向右延伸的最大长度。 l[i][j]表示向左,r[i][j]表示向右。 u[i][j]表示向上。 sum[i][j][0]表示i这条悬线上向左延伸的最大长度。因为是矩形所以我们要维护的是悬线上最小的那个。 sum[i][j][1]表示往右,同理。 然后知道sum[...原创 2018-03-01 19:31:16 · 165 阅读 · 0 评论 -
bzoj1084: [SCOI2005]最大子矩阵(Dp)
题目传送门 。解法: 有点恶心啊。 一开始状态表示错想半天想不出。 %了下题解发现原来这样表示状态就可以了。 一列的很好解决。 两列的就s[i][j][k]表示第一列取到第i个,第二列取到第j个,一共k个子矩阵的最大分值。 然后四种状态转移。 这个位置可以不选:s[i][j][t]=max(s[i-1][j][t],s[i][j-1][t]);然后第一列和第二列分别往前移一...原创 2018-03-01 20:49:26 · 188 阅读 · 0 评论 -
bzoj1060: [ZJOI2007]时态同步(树形Dp)
题目传送门 。解法: 很显然是棵树。 那么给定根以后所有的终止节点其实就是叶子节点。对于任意一个节点。 在其子树中所有的叶子节点到他的距离应该是一样的。 因为所有叶子节点走到他之后后面的路程是一样的。所以树形Dp啊。 处理出每个节点下面的叶子节点到他的最长距离。 然后其他的节点往最长距离去补就完了吧。。。代码实现:#include<cstdio>...原创 2018-03-18 15:23:14 · 216 阅读 · 0 评论 -
bzoj4145: [AMPPZ2014]The Prices(状态压缩+Dp)
题目传送门 。解法: 怎么我跟网上的题解都一样只想到了n*3^m的算法。 居然还可以这样啊。 m<=16那么可以状压为二进制。 1表示选了0表示没选f[i][j]表示前i个商店选j状态的最小花费。 首先所有f[i][j]=f[i-1][j]+d[i]。 因为他来到了这个商店。 然后对于每一个状态j。 枚举他每个没有1的位置 。然后状态转移就很容易啦。 当求完所有的...原创 2018-03-22 19:59:52 · 222 阅读 · 0 评论 -
bzoj2427: [HAOI2010]软件安装(强联通+树形Dp)
题目传送门 。解法: 有些可能互相依赖变成环。 这时候我们需要缩点。 用强联通即可。 然后树形Dp强制选父亲才能选儿子即可。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>...原创 2018-03-13 19:59:14 · 184 阅读 · 0 评论 -
bzoj3675: [Apio2014]序列分割(Dp)
题目传送门 。解法: emmmm一开始理解错题意了写了个错误的方程。 亮老师走过来发现我的方程错了。 赶紧指导一波嘻嘻嘻才理解题意。。 其实仔细想下他不过是分成几段然后每段之间的乘积加上每段的和。 f[i][k]表示前i个数切k次的最大获利。 那么f[i][k]=max(f[j][k]+(s[i]-s[j])*s[j]就行了。斜率优化: 若j>t 且j相对于i来说更...原创 2018-03-20 08:57:41 · 199 阅读 · 0 评论 -
bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏(spfa+Dp)
题目传送门 。解法: 一开始想到spfa。 连向他杀死后产生的怪兽。表示普通攻击 连向ed表示法术攻击杀死的。 那么很显然最短路是不行的。那么就gg了。。 做法蛮神的。 反向连:产生的怪兽连向原怪兽。 那么F[i]表示消灭怪兽i的最小值 那么显然等于min(Ki,F[j]的和) 【不想用数学符号系列】 那么可以进行Dp。 f[i]表示上一次i在队列里的答案。 那么更新...原创 2018-03-20 14:37:09 · 254 阅读 · 0 评论 -
bzoj3930: [CQOI2015]选数(Dp)
题目传送门 。解法: 跟这题思路蛮像的 。 就是作为公因数不一定作为最大公因数。 那么求作为公因数的方案很简单。只需知道有多少个数是他的倍数。然后用个数^N就行了。 f[i]表示最大公因数为i*K的方案。 那么先算出公因数的方案。 然后在减去f[i的倍数]就行了呀。代码实现:#include<cstdio>#include<cstring>...原创 2018-03-21 08:38:40 · 291 阅读 · 0 评论 -
bzoj4318: OSU!(Dp)
题目传送门 。解法: 太强啦。 f[i]表示前i个位置最后的期望得分。 那么只有这个位置填1的时候才能有贡献。 最长全1后缀为x。那么多了一个1就是x+1 用x推出(x+1)^2的期望。 用x,x^2推出(x+1)^3的期望。 %%%Po姐代码实现:#include<cstdio>#include<cstring>#include<cs...原创 2018-03-22 08:57:36 · 360 阅读 · 0 评论 -
bzoj5196: [Usaco2018 Feb]Taming the Herd(Dp)
题目传送门 。解法: f[i][j]表示前i天有j次出逃的最优方案。 随便搞。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#...原创 2018-04-16 13:01:59 · 328 阅读 · 0 评论 -
bzoj2958&3269: 序列染色(Dp)
题目传送门 玄学真的不会。解法: f[i][j][k]表示第i位,k=0填B,k=1填W。 j=0表示一段长为K连续的B都没有。 j=1表示有一段长为K连续的B。 j=2表示有一段长为K连续的W。 因为要先有B是连续的才要W连续。 那么j=2肯定从j=1转移 保证连续的B后面一定有一个W,连续的W后有一个B,答案就是f[n+1][2][0] 假设这一位选B显然有 ...原创 2018-04-16 13:09:56 · 304 阅读 · 0 评论 -
bzoj4247: 挂饰(Dp)
题目传送门 。解法: 先挂钩子多的。 因为假设你最后选出来五个挂饰。 那么肯定是找钩子多的先挂。 那么按照钩子数排个序。 然后Dp一下就行 f[i][j]表示前i个挂完(不一定每个都要选)之后还剩j个钩子。 f[i][j]=max(f[i-1][j],f[i-1][j-a[i].a+1]+a[i].b)代码实现:#include<cstdio>#inc...原创 2018-04-12 15:20:16 · 203 阅读 · 0 评论 -
bzoj1222: [HNOI2001]产品加工(Dp)
题目传送门 。解法: f[i]表示A机器加工i时间B机器用最少的时间。 转移很好写代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>...原创 2018-04-22 19:15:15 · 330 阅读 · 0 评论 -
bzoj4465: [Jsoi2013]游戏中的学问(Dp)
题目传送门 。解法: f[i][j]表示i个人分成j个圈的方案。 那么每进来一个人。他可以不自成圈。他插进别人的圈。 他也可以自成圈。从前面的人中选出两个人跟他成圈即可。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#i...原创 2018-04-22 19:28:41 · 468 阅读 · 0 评论 -
bzoj3209: 花神的数论题(数位Dp)
题目传送门 神。解法: 又是肉dalao推荐的神题。 想了半天发现就算我知道每个的sum我要求派还是会超时啊。 于是我根本没有往同一个sum可能有多个的地方想。 结果正解就是这样的。。数位Dp的思想: f[i][j]表示二进制有i位,最高位为0,一共有j个1 g[i][j]表示二进制有i位,最高位为1,一共有j个1。 那么转移就很容易啦。然后由于有n的限制。 每到一位...原创 2018-02-27 20:05:49 · 252 阅读 · 0 评论 -
bzoj1040: [ZJOI2008]骑士(树形Dp)
题目传送门 神。。解法: 做法还是蛮容易的。 首先它肯定是无向的。因为讨厌是互相的嘛。 然后它肯定是森林(显然) 对于每一棵树。 它如果有m个点。 那么它就会有m条无向边。 那么它只有一个环。 所以我们对于每一棵树,找到一条边。 断开这条边后它剩下m-1条边成为一棵树。 那么对于断开的这条边相连的两个点记为x和y。 对于x和y分情况讨论。 首先他们肯定不能同时选因为一原创 2018-01-29 20:14:52 · 288 阅读 · 0 评论 -
bzoj1003: [ZJOI2006]物流运输(最短路+Dp)
题目传送门 首先这道题肯定有连续几天的航行是一样的。 那么我们不用去求出每天的方案。 只需求出每一段(连续的几天)的最短路然后*天数即可。不难想到Dp。 用f[i]表示前i天的最小花费。 那么方程很容易就转化为: f[i]=min(f[i],f[j]+spfa(j+1,i)+K); 方程表示的是前j天的最小花费+第(j+1)天到第i天用同一种方案的花费+修改一次方案的花费。 还是比较原创 2017-09-16 09:34:17 · 402 阅读 · 0 评论 -
bzoj1087: [SCOI2005]互不侵犯King(状态压缩+Dp)
题目传送门 好久之前学的状态压缩现在都差不多忘了。。解法: 硬搞的话应该很难吧。 所以用状态压缩来优化一下咯。 因为一行最多才9个点。每个点要么没要么有。 那么每一行最多有2^9种状态。 用1表示有国王,用0表示没国王。 这样我们就可以用二进制来表示每一行的状态。那么怎么判断每一行的状态合不合法呢? 每个国王左右都是不能有国王的。 也就是每个1左右都不能有1。 那么我把整个状态往原创 2017-10-09 14:48:14 · 283 阅读 · 0 评论 -
bzoj1207: [HNOI2004]打鼹鼠(Dp)
题目传送门 好水的一道Dp。 水一发。。解法: f[i]表示前i个鼹鼠,第i个要打,最多可以打多少只。 状态继承就很简单。 如果曼哈顿距离<=他们的时间差的话就可以继承咯。最后要所有的f求一遍最大值才行。 因为我们的状态表示是第i个一定要打。但是我们也可能不打。所以所有的f都要求一遍最大值。代码实现:#include<cstdio>#include<cstring>#include<原创 2017-10-11 14:29:09 · 414 阅读 · 0 评论 -
bzoj1044: [HAOI2008]木棍分割(二分+单调队列)
题目传送门 跑了3s那些200ms的是怎么跑出来的。。解法: 第一问蛮简单。以前大概做过这种类型的题。。 就二分一下最长的那一段的长度。 然后O(n)判断一下。第二问不简单。。 求方案诶。 我以前拿60分的时候打的是Dp。。 f[i][j]表示前i个分成j段切最长长度不大于第一问的答案的方案数。 那么继承就为f[k][j-1],k为上一段的结尾且满足k到i这一段木棍长度小于第一问的答原创 2017-10-12 08:21:03 · 424 阅读 · 0 评论 -
bzoj1833: [ZJOI2010]count 数字计数(数位Dp)
题目传送门 这道题怎么跟windy数辣么像啊。 但是比windy数好像很多。解法: f[i][j][k]表示i位数最高位为j,这些数中有多少个k。 Dp方程显而易见不想多说了。memset(f,0,sizeof(f)); for(int i=1;i<=12;i++) for(int j=0;j<=9;j++) { f[i][j][j]=pow原创 2017-10-24 20:21:42 · 378 阅读 · 0 评论 -
bzoj1042: [HAOI2008]硬币购物(Dp+容斥原理)
题目传送门 好强啊我根本没有往容斥原理那方面想。解法: 先预处理出没有张数限制的方案数。 这样每一个问的答案就是: 所以方案数-第一种硬币超过限制的方案数-第二种硬币超过限制的方案数-第三种硬币超过限制的方案数-第四种硬币的方案数。 然后因为第一种硬币超过限制的方案数包含一部分第二种硬币超过限制的方案数,所以要加会一,二种硬币超过限制的方案数。 其他的同理这就是容斥原理了。。代码实现:#原创 2017-11-02 15:35:33 · 373 阅读 · 0 评论 -
bzoj1597: [Usaco2008 Mar]土地购买(斜率优化+Dp+单调队列)
题目传送门 真的舒服我终于第一次自己推出了斜率方程。。 真开心。解法: 其实这道题Dp还是挺好想的。 Dp方程大概就是f[j]+i到j所有的土地一组的花费。 其实看到斜率优化的题我一般都想怎么去搞单调性。。 排序。。 先按照长排序一遍。(升降随意,我从小到大排的) 对于每块土地i,j<i 那么i的长肯定大于等于j的长(排了序) 如果i的宽也大于等于j的宽的话,j就没用了。。 因原创 2017-10-25 20:31:18 · 356 阅读 · 0 评论 -
bzoj1911: [Apio2010]特别行动队(斜率优化+Dp)
题目传送门 好开心又独立做了一道斜率优化原来斜率优化也不是辣么难嘛。。解法: 这道题Dp方程还是蛮好想的。 s[i]表示1到i的和。 f[i]=min(f[i],f[j]+a*(s[i]-s[j])^2+b*(s[i]-s[j])+c)斜率优化。。 设j>k且j对于i更优。 f[j]+a*(s[i]-s[j])^2+b*(s[i]-s[j])+c<f[k]+a*(s[i]-s[k])^2原创 2017-10-26 15:48:33 · 288 阅读 · 0 评论 -
bzoj1801: [Ahoi2009]chess 中国象棋(Dp)
题目传送门 毒瘤题呀。解法: 一眼看上去,装压。。 数据范围100。 怎么压?!?! 也就那么2的一百次方而已。。哇各种不会呀兄弟。 %一发题解,花了好久时间来想。。 仔细讲讲。 f[i][j][k]表示前i行,有j列有一个棋子,k列有两个棋子的方案数。 那么一行显然最多填两个,一列也最多两个。 那么可以分为六种情况。。 1.这行不填。 那么就转移f[i-1][j][k]咯。原创 2017-11-23 13:26:51 · 359 阅读 · 0 评论 -
bzoj3156: 防御准备(斜率优化+Dp)
题目传送门 有点水啊这道斜率优化。。解法: 看到亮哥和Rose都做了这道题。 也忍不住去看了看。 看了之后发现挺水的。 推了个特别长的方程。 很显然应该把数组倒过来然后就变成左边的防御塔咯。 然后f[i]表示前i个的花费。 然后f[i]=min(f[j-1]+(i-j)(i-j+1)/2+a[j])。 然后假设k是在j后面,且相对于i来说k更优。 那么对于i后面的,k也肯定更优。原创 2017-12-03 16:04:18 · 332 阅读 · 0 评论 -
bzoj1925: [Sdoi2010]地精部落(Dp)
题目传送门 神题。解法: 坐了一下午。想了一下觉得这道题有机会可以做出来(不自量力) 想了很久。。 想不出来。。 怎么办。。 %题解! dalao们都说是思维题。。 题解我就不写了。 贴个我看到觉得比较好的吧。 是真的强代码实现:#include<cstdio>#include<cstring>using namespace std;int f[2][5100],n,mod原创 2017-12-30 16:01:10 · 321 阅读 · 0 评论 -
bzoj4884: [Lydsy2017年5月月赛]太空猫(dp)
题目传送门 。。解法: 很水的dp嘛。 因为你落地了才能左右动。 所以每个横坐标只有两种情况一种天一种第。 分两种情况dp转移咯。代码实现:#include#include#include#include#include#include#includeusing namespace std;int n;long long s[110000],x[11000原创 2018-01-24 21:08:57 · 276 阅读 · 0 评论 -
bzoj1030: [JSOI2007]文本生成器(AC自动机+Dp)
题目传送门 好题啊。解法: 直接求很麻烦。 所以转化为总方案减去不合法的方案。 那么不合法的方案就相当于在字典树上面没有经过结尾节点的路径条数。 那么用f[i][j]表示走i步到了第j个节点的方案数。 对应的它下一步走到k。那么f[i+1][k]+=f[i][j]。 但是会出现一个问题。就是。 比如说两个串。 abcd cdef那么当我们匹配了cd的时候其实应该可以原创 2018-02-01 10:37:46 · 281 阅读 · 0 评论 -
bzoj1037: [ZJOI2008]生日聚会Party(Dp)
题目传送门 。。解法: f[i][j][k][l]表示i个男生j个女生。 以当前位置结尾连续一段男-女最大为k。女-男最大为l的方案。 那么状态很好转移。 每进来一个人。 男生的话k+1,l-1 女生的话k-1,l+1转移去吧!代码实现:#include#include#include#include#include#include#includeu原创 2018-02-04 21:30:07 · 231 阅读 · 0 评论