自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(335)
  • 收藏
  • 关注

原创 bzoj1296(dp套背包dp)

对于每一个m的dp没有什么难的,总的背包dp也不难,但是两个连在一块真是非常巧妙整体来看,就是,将t次的粉刷次数分给各个行求的最大值。就是分配先预处理(dp)每一行粉刷1~min(t,m)(因为一行最多涂m次,所以处理到m就可以了)次的最大粉刷格子数。发现很像泛化背包的模型,再外层再做一次分组背包就可以了这所以这么做是因为:我们可以发现不同的木板是相互独立,怎么计算和处理之间互

2016-08-19 11:57:28 1135

原创 bzoj1037(dp 1A)

这道题做的痛快!加油!因为发现三维没法表示状态,没法处理所以,发现数据范围,允许我们再加一维。所以用四维进行表示Dp[i][j][k1][k2]表示i个男孩,j个女孩,从后往前,男孩最多比女孩多k1个,女孩最多比男孩多k2个的方案数(实际上,我们在后面再加一个人,影响区间的男女之差,只会影响到之前那个区间的后缀,因为,前面的区间已经固定了,是不会影响到的)。转移就分,这

2016-08-19 10:30:43 280

原创 bzoj1222(dp)

以前见过这样类型的dp,就顺手水过了。这一类就是用f【i】表示a状态为i,b的最小状态。#include#include#include#include#includeusing namespace std;typedef long long ll;const int inf=0x3f3f3f3f;int f[2][30085];int t1[6005]

2016-08-18 23:37:13 458

原创 bzoj1925(next_permutation的第一次运用,难dp)

刚开始,写小范围暴力,试图找规律,顺便学习了一下next_permutation()(1) int 类型的next_permutation int main(){ int a[3];a[0]=1;a[1]=2;a[2]=3; do{cout} while (next_permutation(a,a+3)); //参数3指的是要进行排列的长度 //如果

2016-08-18 19:50:04 321

原创 bzoj4521(数位dp

自己的主体思路,没有什么问题,有一个情况没有考虑清楚,但主要还是边界出了问题失误的情况是:4和8,不能同时出现,但不代表不能出现两个4,这里当时就记了一个参数,当时以为自己想到了一个巧妙的方法(原来是个巧妙的错误。。)经验——避免这种没有情况的方法就是,1:考场上要对拍 2:注意尝试以一种,怀疑的态度审视自己的思路,再三思考自己认为正确的思路3:有一个,好的方向就是:尽管wa了

2016-08-18 16:50:50 353

原创 bzoj1996(区间dp)

这题只要知道是区间do,就不难做。首先f【l】【r】表示可以满足l~r这个区间的初始队形的方案数,显然我们发现,此时我们加入的队员,只有可能在最左边和最右边,也就是从f【l】【r-1】和f【l+1】【r】转移过来,但是由于我们加入的队员要和上一个队员进行比较,转移,但是f【l】【r】并不能表示,这好办,既然不能表示,就加一维,分情况呗。f【l】【r】【0】表示l~r,最后加入的是最左边的队

2016-08-18 14:24:45 583

原创 bzoj1040(图论+树形dp

刚开始以为是SB题,后来发现我是SB。。。。最开始问题:1.没有考虑会有森林的情况2:没有考虑到只有在环中断开两个点才能保证出现的是一棵树网上说的都太专业了,作为业余水平的选手感觉,其实这题就是,求多个(森林)树上的最大权独立集,但是这里的树上有且仅有一个环,直观来看,就是从u,v断开环,分两种情况,一种是选u,不选v,一种是选v,不选u。再就是那个简单的树形dp,我们想连边就

2016-08-18 13:32:05 429

原创 bzoj1260(区间dp)

主体思路,有了,但是还是没有真正理清楚,转移方程,有一部分就推错了设定dp[l][r];表示l到r的最短涂色,我们考虑s[l]==s[r]时,转移就是dp[l][r]=min(dp[l+1][r],dp[l][r-1]);//这个我没有想出来。其实应该和下面的思想一样,就是当这种情况出现时,可以与原来涂过的方案合并,来减少总涂的数量,s[r]==s[

2016-08-17 23:02:52 730

原创 bzoj2337(卡时dp)

10000的数据,常数比较小,n^2能过设前i个鼹鼠中我们所能打死的最多鼹鼠是f[i]个,状态转移方程就是f[i]=max{f[i],f[j]+1};要保证abs(x[i]-x[j])+abs(y[i]-y[j])<=time[i]-time[j] (j#include#include#include#include#includeusing namespace

2016-08-17 19:54:25 3109

原创 bzoj1090(区间dp,字符串折叠问题)

这个问题比上一个简单一点,应该对比一下两题的相似与不同点,来找到解题的技巧这题是用递推实现的,不用记忆化。f【l】【r】表示,把l~r这个区间折叠的最短长度,然后我们想,对于一个区间来说,我们有两种选择,一种是把这个区间它自己来折叠,另一种是两块已经折叠的区间接起来。对于第二中情况,直接枚举断点,再和答案取min,第一种则是,找出它所有的折叠方案,在折叠方案中取一个最优的

2016-08-17 18:18:41 760

原创 bzoj1068(区间dp,字符串压缩)

这类题真心不会,想思路直接呵呵。。f[l][r][k]表示i-j这段区间,是否放置M(k=1/0)压缩到的最短长度。我们标记此时l-1一定是有M的,或者l-1=0。就是,在这段区间l~r放R的话,一定是从l开头到R的位置和R后面的位置相同,其实就是保证了,l到R之间没有M对于k=1,及对于在这个区间放m,我们分四种情况:首先枚举M的位置i,然后对于被

2016-08-17 16:33:00 482

原创 bzoj1079(dp

这题算是一类非常典型的题,首先,这类题如果数据范围小,那么状态压缩能搞,但是如果压缩之后发现状态数过多,比如这道题,直接状压是5^15次方,几十亿,肯定过不了,然后观察到,15^5,比较靠谱,但是我们可以发现各情况是等价的,如此,我们可以用各情况的次数来设计状态。上一题也是这样的思路。这样的题套上排列组合的一套就可以做了这道还是有点难。。。我被down飞了。。。我们记每个颜色拿了多

2016-08-17 13:36:32 889

原创 bzoj1801(dp棋盘上方案dp)

感觉着一种dp思路还是很好的首先n与m都是f【n】【j】【l】表示n行,j列有一个炮,l列有两个炮,转移的话就根据乘法原理,排列组合,加法原理,就那一套,求方案的计数问题那一套推一推就好了#include#include#include#includeusing namespace std;typedef long long ll;const int mod=9999973

2016-08-16 23:40:56 669 2

原创 bzoj3209(二进制数位dp)

二进制数位dp,就是把原本的数字转化成二进制而以,原来是10进制,现在是二进制来做,没有想像的那么难不知到自己怎么相出来的。。。感觉,如果没有一个明确的思路,就算做出来了,也并不能锻炼自己的能力,因为我现在需要训练的是做题的思维方法啊!sum(i) 表示 i 的二进制表示中 1 的个数。给出一个正整数 N ,求sum(1)—sum(N) 的乘积。首先,这道题直接做,

2016-08-16 19:11:20 1517

原创 bzoj1026(数位dp)

对拍了一下,刚开始wa了一次这是要求处理没有前导0的,模版,其实就是原来的!limit的地方再加上!lead(就这里wa了一次)还有再加一个lead的参数就可以了,当lead为0时表示开始的情况,不要有限制,因为开始是随意的。#include#include#include#include#includeusing namespace std;typedef long

2016-08-16 16:25:27 353

原创 hdu3079(数位dp)

题意:题中平衡数的定义: 以一个位置作为平衡轴,然后左右其他数字本身大小作为重量,到平衡轴的距离作为全职,实现左右平衡(即杠杆原理平衡)。然后为区间[x,y]内平衡数的个数。 (0 ≤ x ≤ y ≤ 1018)思路一:首先一个非0的n位数最多只有1个中心轴,那么我们可以枚举中心轴,算对于每一个中心轴,有多少数字,统计答案,注意0的特殊情况就可以。然后TLE。。。加了一

2016-08-16 13:26:00 551 1

原创 hdu3555(数位dp)

首先,这道题求所有包含49的数,其实就是        总数-所有不包含49的数,求不包含49的数就是像  不要62一样做就好。注意  1:中间过程可能超long long的必须加ll,这个问题任何时候都要关注,要形成稳定的条件反射!!   2:其实求所有包含49的数也很简但,就是上一题13的问题一样,多记录一个参数,多一维就可以#include#include#inclu

2016-08-16 11:23:43 278

原创 hdu3652(数位dp

统计区间 [1,n] 中含有 '13' 且模 13 为 0 的数字有多少个。就是把情况用状态表示出来,几维不是问题,终点是把所有的状态表示出来。转移就是枚举该位是多少,根据这个位是多少,改变下一个dfs的参数,转移到下一位就好边界:注意只有当所有的情况都符合的时候,i==0时才能把方案数置为1,否则,就像这道题,如果到最后没有13,且余数不为0,那么就应该返回方案数0#in

2016-08-16 10:55:39 399

原创 tyvj1034(线性dp经典题,还是不清楚,怎么想出这种做法的?解题的方向是什么?

尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束。当尼克到达单位后他就开始干活。如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去写成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。如果某任务于第P分钟开始,持续时间为T分钟,则该任务将在第P+T-1分钟结束。写一个程序计算尼克应该如何选取任

2016-08-15 19:12:46 571

原创 noip2015day2T2(wuwuwu

这题dp,好推,方程也不难列。就是dp的边界太恶心了,我就弱成这样,搞不清楚边界。还有,就是像这种,数据范围非常大的,就开一下滚动数组吧!感觉,被这道题down死了

2016-08-15 16:15:15 326

原创 vijos1451(区间dp,好题,必须回顾进行再分析!!!)

呜呜呜,我真的太水了。没有人说过,只要是环形的题,就要把它复制一下接在后面。然而我。。。。就犯了这米杀的错误。这道题关建1:分析题目的性质,找出有用的信息,即实质所要求的东西关键2:如果按着题目的描述,来dp的话很难表示,所以通过互补的思维,另一向的思维来做这道题总说:非常锻炼对题目性质与实质的分析#include#include#include

2016-08-15 12:22:11 414

原创 poj1849(树形dp)

试了好几遍才a。。方法很多,来我的g【i】:一个人走完子树的最短dissum【i】:子树的总边距离乘二,就是一个人走完回到根的路程f【i】【0】:表示两者在同一个子树中的最短距离f【i】【1】:表示两者在不同子树中的最短距离感觉状态的表难想,细节难处理。这里的状态,我感觉,是根据题目的性质,分情况(因为只有可能两人在同一个子树或不同的子树两种情况),分情况来表示

2016-08-15 09:21:09 407

原创 选课(依赖背包dp)

其实就是把背包dp搬树上了,注意每一个节点必须要先选自己才能选孩子节点#include#include#include#include#includeusing namespace std;const int inf=0x3f3f3f3f;int n,m,val[305],f[305][305];//第i个节点选j个课程 bool b[305];int tot

2016-08-14 17:47:01 822

原创 poj3211(背包dp)

这是可行性的背包dp,就是问是否能够组成一个量首先,洗完一种再洗一种,颜色之间是不影响的。二,一种颜色的衣服已经定了,要洗的总量已经定了,要让总时间最少,就是要让两人洗的最为接近。(注意这道题只有两个人)转化为可行性的问题,能否组成一种方案,使得这种方案最接近总量的一半,总量一定,这一半最接近,那么那一半也是最接近的#include#include#in

2016-08-14 15:47:56 342

原创 vijos1426(状态压缩背包dp)

并不难想,但也是要练一练写代码的能力注意一点,这里用o【i】数组记录一个状态是否出现!因为N进制状态压缩,会出现太多太多无用的状态!,显然的会超时#include#include#include#includeusing namespace std;int n,m,v[7],f[5000050];bool o[5000050];int S,ans;bool pan

2016-08-14 15:10:25 354

原创 bzoj1835(线段树优化dp)

神题啊,好吧,应该是因为我太弱了。。。设f[i][k]表示到第i个村庄,第i个村庄一定会建基站,已经建了k个基站的最小费用.f[i][k]=min{f[j][k-1]+cost(j+1,i-1)}+c[i];cost(x,y)表示x到y这一段的最小补偿费用.这个dp是O(n^3)的,TLE.由于状态数已经是N^2,主要的瓶颈在于转移的复杂度cost(x,

2016-08-14 12:20:14 1010

原创 hdu4374(单调队列优化dp)

这题的转移很明显。用dp[i][j] 表示到达i层j位置时的最大得分sum[i][j] 表示第i层前j个数的和dp[i][j] = max(max(dp[i - 1][j + k] + sum[i-1][j +k-1] - sum[i - 1][j - 1] + score[i][j]), max(dp[i - 1][j - k] - sum[i-1][j -k] + su

2016-08-13 17:51:57 288

原创 bzoj1855(单调队列优化dp讲解)

这个,感觉思路不是特别清楚。单调队列维护dp,一般就是把一个N维的dp优化成一个N-1维的dp式子形如:dp【i】=max(f【j】)+g【i】(这里的g【i】是与j无关的量),且j的取值是一段连续区间,并随着i增大而增大的区间这里的f【j】是和j有关的项,一般包括dp【j】和与其相关的项。这道题:思路:设f[i][j]表示到第i天手里持有j的股票的最大收益,那么第i天

2016-08-13 15:54:52 1460

原创 尺取法(小知识点,贪心)

给定长度为n的数列整数a0,a1,a2,a3 ..... an-1以及整数S。求出总和不小于S的连续子序列的 长度 的最小值。如果此刻所尺取的区间其实就是贪心啦!实际上定义:反复的推进区间开头或者结尾,求满足条件的最小区间的方法称为尺取法。因为只有向右移,均摊复杂度就是0(n)

2016-08-13 13:16:16 890

原创 bzoj1047(单调队列,矩阵中)

没那么难,不需要什么二维单调队列,其实只要改变一下顺序就好为了思路清晰,这里采用的结构体+结构体函数写的单调队列刚开始感觉不会,看hzwer的blog,上面说,题解都太麻烦,还不如手推,就没继续看下去,事实证明这道题回来一看就秒了,也不知道是怎么想的。。。猜的?其实就是一行一个单调队列,端点每往右移一位,就计算从上到下的情况#include#include#includ

2016-08-13 11:12:45 440

原创 bzoj1012(线段树或单调队列)

线段树#include#include#include#include#includeusing namespace std;struct aa{ int l,r,mx;}a[200005*4];int n,tot,m,mod;void build(int i,int l,int r){ a[i].l=l;a[i].r=r; if (l==r) retur

2016-08-13 10:07:34 1104

原创 bzoj3437(斜率优化

像这题,有的时候正向的dp式子不好进行斜率优化,就是 f【i】=min{f【j】+cost【j+1~i】}样的式子,一般好多都可以斜率优化,但是有一些cost【j+1~i】不能在常数时间内差分之类求出来,反正这题是正向不好差分,但是反向可以差分,就是锯木厂选址那样的思路,一个s【i】表示sigema  j  b【j】*dis[j]  (距离和值相乘这一类的)1:反向来做easy

2016-08-12 23:39:59 258

原创 bzoj1096(斜率优化)

锯木厂选址复杂版。注意颠倒一下顺序做即可#include#include#include#include#includeusing namespace std;typedef long long ll;const int N=1000005;ll read(){ ll ans,f=1;char ch; while ((ch=getchar())'9') if

2016-08-12 18:49:14 298

原创 bzoj1010(斜率优化)

裸的斜率优化刚开始我还很脑残的就把那个基本的式子带进去推(斜率式)了。。。可是那个实在是太复杂了,由此说明,如果我们可以尝试通过一些方法将式子简化,再代入斜率优化来推。比如本题:容器长度x=j-i+Sigma(Ck) ,他是说,每一个玩具之间都要加一个单位长度隔开,其实就当玩具长度加一,一个组合的长度就是总长度-1(因为间隔数是玩具数-1)所以间隔要少一个。这叫,优化d

2016-08-12 17:38:02 404

原创 COGS锯木厂选址(斜率优化)

这道题,需要选两个锯木厂,标定了选的份数,以前做的题都是可以分成任意的分数实际上,这道题n^2枚举锯木厂的位置,O( 1 ) 计算,找出最大值。算是斜率优化,感觉不是特别好说是斜率优化dp,因为这道题,当确定了第二个锯木厂,第一个锯木厂的选择是有决策单调性,其实斜率优化就是用了处理决策单调性的问题决策选取的,这道题推式子可以推出来斜率式,能推出斜率的式子,就可以来用单调队列维护决策

2016-08-12 16:24:24 320

原创 后缀数组求lcp(模版,st模版把

算模版?,不过这东西,顺着思路很好写啊,注意log的强制类型转环就行了

2016-08-12 11:48:48 1825

原创 codeforces367(字符串hash求lcp比较大小,Trie解最大异或问题)

C:有n个字符串,排在一列,我们要求让这些字符串按字典序升序排列,对于一个字符串我们可以将它反转,有一个费用ci,求使升序排列的最小费用dp+log len的比较大小f【i】【0】表示不翻转,使前i个升序的最小费用f【i】【1】表示反转,使前i个升序的最小费用肯定是从f【i-1】【0】或【1】转移来的只要判断大小就可以了不过有个很关键的,文中说字

2016-08-12 09:31:45 566

原创 bzoj3156(斜率优化)

一般斜率优化的题就那一个式子(又在瞎说。)刚开始推了两个f[k]+(i-k)*(i-k-1)/2+a[i]设K=k+1,J=j+1 f[k]+(i-k)*(i-K)/22*f[k]-i*k-i*K+k*K2*(f[k]-f[j])+k*K-j*J(2*(f[k]-f[j])+k*K-j*J)/(k+K-j-J)#include#in

2016-08-11 23:10:11 402

原创 bzoj1597土地购买(斜率优化)

分析题目如果一个矩阵长宽都小于另一个矩阵,那么这个矩阵是可以忽略的然后以长升序,宽降序排序,再按上面的优化去重,最后会得到长升序,宽降序的序列(因为后边的长肯定长,如果不降序,那么有一个肯定会被后边的覆盖)dp【i】=min(dp【j】+width【j+1】*height【i】);//本题,要求两个最大值相乘的值,max不满足区间减法,然后灵活的通过分析题目性质排序,将最大值处

2016-08-11 17:09:39 492

原创 apio2010特别行动队(斜率优化)

这题是上凸形,题目当中,还是要注意括号的问题。。因为括号套错了一层RE了好几次关于,斜率优化,感觉一般的常数项,和i有关的就都放在右边吧,比如已知的那些常量,由此尽量保证左边的上下分子分母都是正的应该是好处理吧#include#include#include#include#includeusing namespace std;typedef lon

2016-08-11 15:13:54 300

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除