
DP
文章平均质量分 68
BPM136
さよなら 愛しき日び 戾れないのは 僕だけでいいから
展开
-
SDOI2016 R1 day2 T3 征途 斜率优化DP
我们写出式子 fi,j=fk,j-1+(si-sk)^2,然后固定一个j,哗哗就出来了又是今天的T3,然而傻逼到不会写写了个错的70分滚粗那么傻逼的题都只有230,这是滚大粗的节奏啊/* ***********************************************Author :BPM136Created Time :2016-4-25 10:20原创 2016-04-25 22:37:16 · 1339 阅读 · 0 评论 -
pku1848 Tree 树形DP
这题最坑的地方在于,我以为对于输入的边一定是y的父亲是x,英语实力捉急的我= =好吧承认看了题解/* 本题有三种状态,分别是 dp[u][0],以u为根,所有的点都在环内 dp[u][1],以u为根,除了u外其余的都在环内 dp[u][2],以u为根,除了u和与u点相连的链(至少有两个点)外,其余的点都在环内 有四种状态转移 1、所有子节点都满足在环内,只有根节点不原创 2016-03-20 18:34:52 · 478 阅读 · 0 评论 -
pku1795 DNA Laboratory 状压DP
做的快哭惹QAQQQQQQQQQ,周伟的论文不知是老师给的版本问题还是啥看不到题解!!!!!!QAQQQQQQ然后我决定自行解决我们可以想到用一个状态表示已经选择的字符串,然而发现这个不对劲,因为一个字符串是有顺序的!然后机智的我发现拼接只和尾巴那个字符串有关!很好我们就可以多加一维来表示当前状态下的字符串最后一串之前是谁的很好我们搞定了状态就几乎等同于搞定了这个状压DP的大部分惹原创 2016-03-08 17:18:40 · 508 阅读 · 0 评论 -
poj2441 Arrange the Bulls 状压DP
看了下别人的实现感觉不科学写的那么复杂然而速度是我的1/2= =我们看到这个很容易联想到棋盘模型n*m,放置n个车,问方案数.然后愉快地做就行,最简复杂度O(n*2^m),然而窝写成O(m*2^m)其实也无所谓Problem: 2441 User: BPM136Memory: 4812K Time: 235MSLanguage: G++ Result: Accepted#i原创 2016-03-08 08:42:42 · 395 阅读 · 0 评论 -
SSL2418 数字序列 状压DP
题目大意,求一个数列的方案数,这个数列满足,只由1到k之间的数字组成,而且当ai=aj时,i和j的差值至少为ai之前那个50分的是因为压得方式不同设f[i,i1,i2...ik]表示长度为i,数字1上一次出现位置在第i位的前i1位,2上次在i的前i2位……有多少种方案当i1>=1时,i1=0。当i2>=2时,i2=0……通过实践发现,k=7时,合法的i1,i2……ik状态最多900原创 2016-03-19 11:50:24 · 1789 阅读 · 0 评论 -
PKU1038 Bugs Integrated, Inc. 状压DP
周伟的论文没能看懂感觉挺羞愧的然而现在我也没能理解。然后滚去看黑书,P138首先我们先没枚举上一行的状态,dfs这一行的状态,用三进制来表示从上向下有连续的多少个0,然后我们就可以愉快地转移了。虽然仅仅用时1266ms,但是我并没有明白为什么会这么快,原本以为会T的很惨的。显然我们先枚举行,然后枚举上一行状态。此时极限数据会达到150*50000+*50000+,然后又5组数据……根本原创 2016-03-07 21:54:48 · 415 阅读 · 0 评论 -
SCOI2005互不侵犯King 状压Dp
一脸懵逼,爆int,然而在数据范围内的我出的几组测试数据都是负数= =好吧不多说,用邻接表优化转移,还有就是比较的时候si不但直接和sj比,还直接和sj/2和sj*2比就行复杂度倒是很正常丝毫不会爆#include#include#include#include#include#include#include#define LL long long#define fo(原创 2016-03-06 21:22:35 · 425 阅读 · 0 评论 -
模拟赛4 数字序列 50分做法 状压DP
题意:求由1到k之间的数字组成的,满足如果ai=aj,则i-j>=ai的序列个数一脸懵逼在比赛中想不出AC方法,50分做法:考虑状压,因为新的一位能放哪些数字只和最后m-1位有关,又因为k在50分数据也就是k=5时刚好能跑出来时间复杂度O(n*k^k),大数据直接爆炸= =毕竟太弱#include#include#include#include#include#inclu原创 2016-03-17 16:51:05 · 441 阅读 · 0 评论 -
pku1191 棋盘分割 DP
简单的枚举切法然后记忆化更新时间复杂度嗯……n^m?其实要小的多,然而好像只能这样写Problem: 1191 User: BPM136Memory: 1500K Time: 16MSLanguage: G++ Result: Accepted#include#include#include#include#include#include#define LL lo原创 2016-03-16 16:27:29 · 459 阅读 · 0 评论 -
pku1159 Palindrome DP
有一个感悟就是一大群人指着错的东西硬说是对的= =MLE后想了下答案最大也就5000,然后改成short int 就可以了,A掉之后翻了下discuss,然后看到了一条定理:答案是长度减去与反串的最长公共子串= =当时我就懵逼了赶快手写了一组数据发现是错的,然而似乎子序列就对了然后我点开回复一条一条的看看到一条这样的:哥/姐,最长子列不要连续地.........大侠连最长公共子序原创 2016-03-16 15:25:36 · 472 阅读 · 0 评论 -
vijosP1194 Domino 状压DP+矩阵优化
我们知道邻接矩阵的k次方就是一个从i到j之间允许重复路径的条数然后我们对于这题我们也可以向着这个方向转化先用dfs搜索出所有的状态转移,然后把每一个状态当成一个点,就变成上面的问题了当然最极端的方法自然是推递推公式或者通项公式啦#include#include#include#include#include#include#include#define fo(i,a,原创 2016-03-11 12:14:34 · 542 阅读 · 0 评论 -
ZSOI2012 捡金子 字典树+树形DP
我们显然可以用字典树来维护这个东西,然后上面跑树形DP唯一比较虚的是动态的字典树就有三个点超时= =静态的就跑的超快了代码中含有静态的动态的代码#include#include#include#include#include#include#include#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++原创 2016-03-23 15:50:34 · 696 阅读 · 0 评论 -
SSL2512&BZOJ1898 沼泽鳄鱼
想明白了这东西能分成12个时刻,于是就有12个矩阵,然后乘起来当成操作就行了,时间复杂度一个n3logkProblem Id:2511 User Id:BPM136 Memory:1756K Time:75MSLanguage:G++ Result:Accepted#include#include#include#include#include#include#def原创 2016-03-15 15:52:26 · 407 阅读 · 0 评论 -
hdu4352 XHXJ's LIS 数位DP
第一次交MLE一脸茫然= =重新交了一次A= =记忆化搜索的状态为在任意取的情况下第i位,状态为j,LIS的长度为k的数量s表示对于一个状态i,插入j之后的状态,如果不预处理就会慢很多然后呢我们在dfs的时候要判断多一个前导0来判断状态的变化其他的如同上一道题的写法,然而时间复杂度发现很难计算了,首先是记忆化的时间为2^10*10*10,预处理同上,然而剩下的应该是一个比较小的组合原创 2016-03-15 09:35:34 · 405 阅读 · 0 评论 -
hdu2089 不要62 数位DP
入门题,看到YMW开始撸数位DP时我也来凑个热闹= =然而不管什么数据都差了1= =然后看到了教程中这么清爽的代码= =我决定来规范一下数位DP的代码风格一般来说数位DP怎么写都不容易T但是有时候出题人用心良苦出到10的100w次方的时候【比如GDKOI,感觉还是很虚的突然想起来决定来吐槽一下HDU,居然有人把BPM136这个账号注册了= =,好吧只好改成BPMThor#i原创 2016-03-15 08:05:15 · 408 阅读 · 0 评论 -
pku1925 Spiderman DP
........Problem: 1925 User: BPM136Memory: 4560K Time: 500MSLanguage: G++ Result: Accepted#include#include#include#include#include#include#define LL long long#define fo(i,a,b) for(int i原创 2016-03-25 10:35:49 · 498 阅读 · 0 评论 -
poj1014 Dividing 多重背包DP+神剪枝
这题discuss里的做法我无疑是服气的= =考虑值为6的石头:将值为6的石头分为两部分,一部分均分为两堆,另一部分用于填补缺口。所谓填缺口就是当其他的石头分完之后再把这部分石头分入两堆(也有可能只放入一堆)。现在考虑需要多少6值石头用于填缺口。假设左边的总值小于右边的总值1.要能均分,剩下的缺口一定是6的倍数;2.在分配其他的石头时,可以做到尽可能的是缺口小(比如,如果可以原创 2016-03-14 17:07:02 · 422 阅读 · 0 评论 -
POJ DP题目合集
打星号的表示个人认为比较经典,或是算法比较好的题目 1014* Dividing 半个背包,注意中断,否则可能TLE1036 Gangsters 可以很水的DP过,还有多种优化的方法1038* Bugs Integrated, Inc.状态压缩1050 To the Max最大子矩形 枚举每个列数为n的矩阵,然后对这些矩阵分别进行DP处理转载 2016-03-14 16:16:39 · 735 阅读 · 0 评论 -
bzoj1026 [SCOI2009]windy数 数位DP
先用fi,j表示在长度为i时尾数为j,然后我们dfs位数容斥统计也可以,直接分类统计也可以复杂度……额,casenumber*200?反正小到发指不用理他23333333/************************************************************** Problem: 1026 User: BPM136 Language原创 2016-03-13 21:40:49 · 354 阅读 · 0 评论 -
pku3229 The Best Travel Design 状压DP
题意太过于坑爹,数据也迷之坑,反正坑的不行。重边啊题目说是整数给小数啊什么鬼都出来了= =嘛直接状压,伪TSP问题,floyed做完prework一切好办Problem: 3229 User: BPM136Memory: 5092K Time: 1047MSLanguage: G++ Result: Accepted#include#include#include#in原创 2016-03-24 16:23:59 · 484 阅读 · 0 评论 -
pku1947rebuilding roads 树形DP
突然感觉自己代码写的好丑= =今天突然手不听话了疯狂打错字= =显然树形DP,表示fi,j是在第i个点,有j个点连着的最小值显然看每一棵子树的转移,显然背包Problem: 1947 User: BPM136Memory: 816K Time: 0MSLanguage: G++ Result: Accepted#include#include#include#inc原创 2016-03-24 10:53:11 · 496 阅读 · 0 评论 -
pku1141 Brackets Sequence 区间DP
好像是很经典的区间DP但是其实想一下也不难记忆化搜索从i到j区间内的最小冲突数然后根据mark的进行更新时间复杂度明显的n3但是其实我还有一种想法不知可不可行首先把整个序列拆分成为两个要么是全是小括号的要么全部都是中括号的然后把每个序列中的左括号标记为1,右括号标记为-1然后计算前缀和,那么每个单独的合法序列为最终的值为0且中途不出现负数然后我们添加括号使其合法原创 2016-03-16 12:01:41 · 408 阅读 · 0 评论 -
POJ1088 滑雪 记忆化搜索
事实证明即使是水题也不能乱写暴力= =以为暴力加点剪枝就能过了嘛,然后就怒写暴力= =前车之鉴:Problem: 1088 User: BPM136Memory: N/A Time: N/ALanguage: G++ Result: Time Limit Exceeded#include#include#include#include#include#inclu原创 2016-03-16 09:25:52 · 429 阅读 · 0 评论 -
NOIP2006开心的金明
背包#include#include#include#include#include#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;#define N 30005#define M 25int w[M],c[M];int原创 2015-12-28 21:59:00 · 939 阅读 · 0 评论 -
NOIP2000乘积最大
其实……数据完全没有40那么多= =最多10#include#include#include#include#include#include#include#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using name原创 2015-12-28 21:09:53 · 784 阅读 · 0 评论 -
NOIP2006能量项链
我们可以把整个环断开,但是我们要枚举这个断电,于是我们把e向后多放一遍这样就可以直接枚举过去了然后我们设f[i][j]表示合并i和j所带来的能量花费显然有f[i][j]=max(f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]),N3的#include#include#include#include#include#include#define fo原创 2015-12-28 20:09:12 · 557 阅读 · 0 评论 -
NOIP1996找地雷
简单DP#include#include#include#include#include#include#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;#define N 205int a[N][N],w[N],pre[N]原创 2015-12-28 19:53:10 · 624 阅读 · 0 评论 -
HNOI2008玩具装箱(T_OY)bzoj1010
//斜率优化DP,详情看程序#include#include#include#include#include#include#include#include#include#include#include#define inf 1000000000#define LL long longusing namespace std;LL read(){ LL x=原创 2015-08-27 13:49:02 · 525 阅读 · 0 评论 -
【数论】君と彼女の恋
神 「肯定 。美雪 准备了两个 变数 ,记它们为 n和m」神 「找到一个非 空的非负整数序列 S,满足 S的所有元素之和为 n,而且每个元素对 m取模得到的结果都不相同 」神 「这种 序列的个数 ,对神的电话号码取模, 就是 命运的数字 」更加 听不明白 了…… 但是 你能懂的吧。【嗯…… 怎样 的两个序列算是不同的?】神 「只要长度不相同,或者 存在 一位原创 2015-08-27 14:15:55 · 1879 阅读 · 0 评论 -
APIO2010特别行动队bzoj1911
//斜率优化DP#include#include#include#include#include#include#include#include#include#include#include#define inf 1000000000#define LL long long#define sqr(x) ((x)*(x))#define check(j,k,i) ((原创 2015-08-27 13:56:39 · 498 阅读 · 0 评论 -
轮舞前夕
君と彼女の恋这套题的t1,这是t2,经典的树形dp,多了一个统计方案数而已,写的常熟还不如JZ初中的人小QAQQQQQQQQQQQ#include#include#include#include#include#include#include#include#include#include#include#define inf 1000000007#define LL原创 2015-08-27 14:18:42 · 454 阅读 · 0 评论 -
APIO2014序列分割bzoj3675
最开始输出98,最开始赶脚是窝姿势不对……偷偷瞄了一眼黄学长的blog感觉get了新姿势,怒码,然后还是98……最后居然是窝括号的位置放错了……过于隐蔽肉眼没能debug出来QAQQQQQQQQQQ……还是太弱了……这题很显然窝们可以写出Dp方程分程f[i]=f[j]+s[j]*(s[i]-s[j]),因为这题实际上和切的顺序是无关的,其实这很显然证明就是对于答案中的每一个区间必然会被乘上k?原创 2015-08-27 17:50:50 · 580 阅读 · 0 评论 -
NOIP2006金明的预算方案
有依赖的DP,标准写法是树形的但是听说这题会t……#include#include#include#include#include#include#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;#define M 40000原创 2015-12-29 20:08:55 · 558 阅读 · 0 评论 -
bzoj1084[SCOI2005]最大子矩阵
fijk表示第一列选了i个第二列选了j个已经搞定了k个子矩阵的情况然后考虑转移,可以不选,从上面转移作为初值,可以选,于是枚举之前的进行转移就行实际上我们看到了m#include#include#include#include#include#include#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++原创 2015-12-29 21:23:37 · 462 阅读 · 0 评论 -
pku1080 Human Gene Functions DP
表示为串1匹配到第i位,串2匹配到第j位时的最大分数复杂度N2,常数因为写法问题略微大了点Problem: 1080 User: BPM136Memory: 732K Time: 16MSLanguage: G++ Result: Accepted#include#include#include#include#include#include#define LL原创 2016-03-16 08:33:38 · 361 阅读 · 0 评论 -
pku1050 To the Max DP
最小矩阵和 太久没写了纠结了好久该怎么统计,然后发现自己SB了Problem: 1050 User: BPM136Memory: 788K Time: 0MSLanguage: G++ Result: Accepted#include#include#include#include#include#include#define LL long long#define原创 2016-03-15 21:25:22 · 353 阅读 · 0 评论 -
pku1036Gangsters Dp
DP不小心写错还真的挺难调的= =递推,时间复杂度(T*m+n)状态为第i时间门的程度为j的最大繁荣值Problem: 1036 User: BPM136Memory: 704K Time: 125MSLanguage: G++ Result: Accepted#include#include#include#include#include#include#d原创 2016-03-15 20:45:23 · 395 阅读 · 0 评论 -
SGOI 海上搜索 状压DP
SSL1317 本来以为暴力枚举矩形左上角dfs推右下角的点和DP复杂度一样结果一想发现复杂度整整多了个n = =#include#include#include#include#include#include#include#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,原创 2016-03-01 21:33:38 · 819 阅读 · 0 评论 -
国际大学生程序设计竞赛例题解3
内容是图论,动态规划,以及综合题心得:图论,中间的算法并不是非常的新,有许多的算法并没有讲到,所以大家要是自己看算法导论或者别人的程序实现来学习算法会更好然后是从例题中得到的经验:有一道很经典的题,就是双向边的改边问题,书中实际上出现了两次一模一样的这个问题,但是方法是完全不同的一种是利用深度搜索树中的前序遍历,后序遍历,以及前序遍历中子树能达到的最小标号来区分前向边,后向边,交叉原创 2016-02-10 12:09:45 · 814 阅读 · 0 评论 -
bzoj2431[HAOI2009]逆序对数列
天哪天哪天哪我们用f[i][j]来表示前i个数,有j对逆序对的方案数,so考虑插入,因为i比1到i-1里面的任何一个数都要大,所以插入的时候后面有多少个数,就会多出多少逆序对,所以前面的符合条件的都可以转移,f[i][j]=sigma(f[i-1][j-k]),k属于0到i-1,然而前缀和神烦.#include#include#include#include#include#in原创 2015-12-26 11:40:11 · 404 阅读 · 0 评论