
-------------DP-------------
CHN_JZ
爆0 forever
展开
-
BZOJ 4720 [Noip2016]换教室——期望DP
4720: [Noip2016]换教室题目描述对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。在可以选择的课程中,有2n节课程安排在n个时间段上。在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室ci上课,而另一节课程在教室di进行。在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程。如果学生想原创 2017-05-17 20:55:14 · 656 阅读 · 0 评论 -
[DP]51 Nod 1597——有限背包计数问题
题目梗概你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少解题思路分块考虑这个问题,因为大于n√\sqrt n的数可以无限使用。小于n√\sqrt n的背包用前缀和维护。大于n√\sqrt n的背包变换DP的定义。f[i][j]f[i][j]表示放入了i个数,和为j,那么只有两种情况:f[i][j−i]−>f[i][j]f[i][j-i]->f[i][原创 2017-09-28 15:06:05 · 498 阅读 · 0 评论 -
[斜率优化]BZOJ 1911—— [Apio2010]特别行动队
题目传送门解题思路转移方程不难推出。f[i]=max(f[j]+a∗(s[i]−s[j])2+b∗(s[i]−s[j])+c)f[i]=max(f[j]+a*(s[i]-s[j])^2+b*(s[i]-s[j])+c)转化后可得f[i]=max(f[j]+a∗s[j]2−b∗s[j]−2∗a∗s[i]∗s[j])+a∗s[i]2+b∗s[i]+cf[i]=max(f[j]+a*s[j]^2-b*s[原创 2017-09-28 17:06:01 · 581 阅读 · 0 评论 -
[数位DP]Hdu 3555——Bomb
题目梗概求不超过n的含4949的数字的个数。解题思路数位DPSB题。#include<cstdio>#define LL long longusing namespace std;LL n,f[25][15],x;int a[25],len,t;LL DFS(int len,int lst,int pd){ if (len<1) return 1; if (!pd&&f[l原创 2017-10-06 21:28:59 · 727 阅读 · 0 评论 -
[矩阵快速幂优化DP]BZOJ 4037——Str
题目梗概你有一个长度为nn的数字串。定义f(S)f(S)为将S拆分成若干个的1~m数的和的方案数。你可以将这个数字串分割成若干个数字(允许前导0),将他们的f()f()加起来。比如g(123)=f(1+2+3)+f(1+23)+f(12+3)+f(123)g(123)=f(1+2+3)+f(1+23)+f(12+3)+f(123)。已知字符串和m后求答案对998244353998244353取模后的原创 2017-10-07 19:58:51 · 875 阅读 · 0 评论 -
[矩阵快速幂 优化DP] 51Nod 1311 转换机
题目梗概给出一个初始字符串S和目标字符串T,仅包含a,b,c三种字母。给出三种操作:1)将字符串S中的一个‘a’字符变成‘b’,并消耗cost0的花费;2)将字符串S中的一个‘b’字符变成‘c’,并消耗cost1的花费;3)将字符串S中的一个‘c’字符变成‘a’,并消耗cost2的花费;在总花费不超过M的限制下,求有多少种方案将S转化为T。(|S|<=11,M<=1e9)解题思路将S转化为T的最小花原创 2017-09-27 20:55:21 · 650 阅读 · 0 评论 -
[矩阵快速幂加速DP]Codeforces 717D Bubble Cup 9 -Finals D. Dexterina’s Lab
题目梗概进行一个NIM游戏。对于每一堆,出现数字X(1<=X<=100)的概率为ax。求先手有必胜状态的概率。(堆数<=1e9)解题思路首先我们必须知道如果异或和为0为必输状态,否则必胜。f[i][j]f[i][j]表示前i堆,异或和为j的概率是多少。转移关系是一定的。f[i][jxork]+=f[i−1][j]∗p[k]f[i][jxork]+=f[i-1][j]*p[k]。显然可以构造矩阵优化。原创 2017-09-27 20:29:58 · 1333 阅读 · 0 评论 -
[树形DP]51 Nod 1500——苹果曼和树
题目梗概有一个n个节点的树,每个节点都有黑色或白色。问有多少种删边方式,使得删完后的每棵树有且仅有一个黑点。解题思路没什么好suo的,直接树形DP。#include<cstdio>#define LL long longusing namespace std;char nc(){ static char buf[100000],*l=buf,*r=buf; if (l==r)原创 2017-10-18 21:11:43 · 729 阅读 · 0 评论 -
[DP]BZOJ 1190——[HNOI2007]梦幻岛宝珠 动态规划]
题目梗概一个背包问题,但是有一些奇怪的条件。背包大小<=2302^{30} N<=100N<=100 物品符合a∗2b(a<=10;b<=30)a*2^b(a<=10;b<=30)题目梗概把背包大小看成一个二进制数。将f[i][j]f[i][j]定义为前i位数,2i2^i这位选择了j个大小。枚举第i−1i-1位填kk,显然剩下的j−kj-k都由第ii位填满,所以可以得到转移方程f[i][j]=max原创 2017-10-06 16:16:20 · 931 阅读 · 0 评论 -
[DP] 51 Nod 1274——最长递增路径
题目描述一个无向图,可能有自环,有重边,每条边有一个边权。你可以从任何点出发,任何点结束,可以经过同一个点任意次。但是不能经过同一条边2次,并且你走过的路必须满足所有边的权值严格单调递增,求最长能经过多少条边。 以此图为例,最长的路径是: 3 -> 1 -> 2 -> 3 -> 2 或 3 -> 1 -> 2 -> 3 -> 4 长度为4。解题思路很自然想到将边排序。 然后DP。 但是原创 2017-10-21 11:21:08 · 669 阅读 · 0 评论 -
[DP]51 Nod——[1048 整数分解为2的幂 V2]
题目描述给定正整数N,求N分解成若干个2的次幂的方案数。N<=1030N<=10^30解题思路之前写过O(n)O(n),看到这个数据范围瞬间就恐惧了。将N表示成一个二进制数,对于每个ai=1ai=1,都有一段区间的和刚好等于2ai2^{ai}我们考虑如何构造区间设g[i][j]g[i][j]表示前i个位置,最大数是2j2^j的方案数很快得到递推式g[i][j]+=g[i−1][k]∗f[ai−k][原创 2017-10-24 20:29:51 · 798 阅读 · 0 评论 -
[基环外向树+树形DP]BZOJ 1040—— [ZJOI2008]骑士
题目描述有n个骑士,每个骑士有一个不想一起组队的人。每个骑士还有一个战斗力,求战斗力最大的队伍。解题思路把每个骑士和不想组队的骑士之间连边,会形成一堆基环外向树形成的森林。假设每个联通块是树,边数=n-1,显然不符合。假设每个联通块存在两个及以上的简单环,边数>n,也不符合。所以图必然是基环外向树形成的森林。先随意建树寻找返祖边,确定两个点和一条边。分别以这两个点为树根并砍掉这条边进行树形DP,f[原创 2017-12-11 19:04:41 · 684 阅读 · 0 评论 -
[树形DP+贪心]BZOJ 1217—— [HNOI2003]消防局的设立 Plus?
题目描述给出一棵树。你可以设置一个特殊节点,距离这个节点小于等于2的节点被覆盖。求覆盖所有节点所需的最小特殊节点数。解题思路这题是51 Nod 夹克老爷的愤怒的弱化版。51Nod上的那题将范围推广至于n同阶的级别。主要就是利用贪心进行树形DP。#include<cstdio>using namespace std;const int maxn=100005,INF=2147483647;int原创 2017-12-03 21:21:52 · 435 阅读 · 0 评论 -
[数位DP] Codeforces 809C Round #415 (Div. 1) C. Find a car
题目梗概有一个1e9∗1e91e9∗1e9的矩阵,记第x行y列的元素为(x,y) (x,y)的值,定义为所有(i,y),(x,j)(1≤i解题思路这种题目一看就是有一个结论。通过一些奇怪的途径我知道了结论,位于(x,y)的数字为((x−1)xor(y−1))+1((x−1)xor(y−1))+1运用容斥原理我们只需要考虑到(1,1)的矩阵的数字和。定义f[i][j][k][t]f[i][j][k原创 2017-09-27 21:36:03 · 547 阅读 · 0 评论 -
[数位DP]HDU 4507——吉哥系列故事——恨7不成妻
题目梗概如果一个数满足以下三个条件之一,我们称这个数与7有关:1、整数中某一位是7; 2、整数的每一位加起来的和是7的整数倍; 3、这个整数是7的整数倍; 求一个区间和7无关的数字的平方和。解题思路如果这题统计的方式不是平方和,那么就是一道非常经典的数位DP的问题。其实我们要解决的最主要的问题就是添加一个数后如何快速转移平方和。储存每个状态的个数,加和,平方和就解决了这个问题。#include<cs原创 2017-09-27 21:09:16 · 707 阅读 · 0 评论 -
[DP]Codeforces 743E Vladik and cards
题目梗概给出 n 个元素的序列,每个元素的是大小不超过 8 的正整数。请找出满足下面两个条件的最长 子序列: 1. 任意两个数字出现的次数之差的绝对值不超过 1, 未出现的算 0次; 2. 相同的元素是连续的(在原始序列中可以不连续)。解题思路首先枚举一个t表示每个数的个数为t或t+1(这里其实可以二分)。因为每个数选择的区间必须连续,所以可以用DP验证。f[i][j]表示前i个数,j状态下的原创 2017-09-25 21:26:08 · 523 阅读 · 0 评论 -
SPOJ ACPC13——Increasing Shortest Path
题目传送们题目梗概给出一个有mm条边(有边权)nn个点的有向图。 给出QQ个询问ai,bi,ciai,bi,ci,询问aiai到bibi边数不超过cici的路径和的最小值,且要求该路径上的边权递增。解题思路因为有边权递增的限制,不难想到把所以边排序之后一条条插入。 考虑一个数组f[i][j][k]f[i][j][k]表示从ii到jj的路径经过边数为kk的最小值。 以每个节点为起点来考虑这个问题原创 2017-07-12 17:18:56 · 710 阅读 · 0 评论 -
斜率优化总结
斜率优化斜率优化是用于优化一些线性DP,主要思想类似于凸包。 下面来看一个例题:HDU 3507 由题意不难想到是DP,也很容易退出转移过程f[i]=min(f[j]+(s[i]−s[j])2)+M(i∈[0,i−1])f[i]=min(f[j]+(s[i]-s[j])^2)+M (i\in[0,i-1]) 但是一看nn的范围马上就萎了,下面来看看用斜率怎么优化。 现将推出的转移方程化简:f[原创 2017-06-13 19:39:40 · 2226 阅读 · 2 评论 -
[斜率优化]BZOJ 1096——仓库建设
1096: [ZJOI2007]仓库建设题目描述 L公司有N个工厂,由高到底分布在一座山上。如图所示,工厂1在山顶,工厂N在山脚。由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。由于地形的不同,在不同工厂建立仓库的费用可能是不同的原创 2017-06-13 20:08:14 · 807 阅读 · 2 评论 -
[斜率优化]BZOJ 1010——玩具装箱toy
1010: [HNOI2008]玩具装箱toy题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1…N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一原创 2017-06-13 20:26:54 · 950 阅读 · 2 评论 -
[DP]LOJ NOI Round #1——接竹竿
题目描述一天,神犇和 LCR 在玩扑克牌。他们玩的是一种叫做“接竹竿”的游戏。游戏规则是:一共有 n 张牌,每张牌上有一个花色 c 和一个点数 v,花色不超过 k 种。将这些牌依次放入一列牌的末端。若放入之前这列牌中已有与这张牌花色相同的牌,你可以选择将这张牌和任意一张花色相同的牌之间的所有牌全部取出队列(包括这两张牌本身),并得到与取出的所有牌点数和相同的分数。现在已知 LCR 把这 n 张牌放入原创 2017-07-07 14:01:30 · 1705 阅读 · 1 评论 -
[状态压缩||折半搜索]51nod 算法马拉松3 A
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2017-07-17 22:01:40 · 822 阅读 · 0 评论 -
[数位DP]Hdu 2089——不要62
Ps:博主又水blog,是佳龙大神叫我干的。题目梗概一个数被称为吉利(手动滑稽)当且仅当其不含4和62。多次询问一个区间的吉利的个数。解题思路这题应该算是数位DP的裸题吧。考虑求出一个固定长度出现的吉利数,然后分别考虑每一位就可以了。设f[i][0/1/2]f[i][0/1/2]表示长度为ii的吉利个数,首位为2的吉利个数,不吉利的个数。转移方程就不难求出: f[i][0]=9*f[i-1][原创 2017-08-08 21:30:14 · 661 阅读 · 0 评论 -
[数位DP+矩阵快速幂优化]BZOJ 1875——[SDOI2009]HH去散步
题目梗概给出一张有向图,并给出一个起点和一个终点。求从起点走到终点走t步的方案数。解题思路比较裸的数位DP。f[i][j]f[i][j]表示第步j走到i点的方案数,转移显然。因为这题有重边,所以i改为第i条边的终点。#include<cstdio>#include<cstring>using namespace std;const int maxn=25,maxm=125,tt=45989;原创 2017-08-20 15:47:54 · 647 阅读 · 0 评论 -
[树形DP]BZOJ 4033—— [HAOI2015]树上染色
题目梗概给定一棵树,树边有边权。将树上KK个点染成黑色,其余n−Kn-K个点为白色。使相同颜色节点的路径和最大。解题思路不难想到是一个树形DP的题目。考虑每一条边要被计算的次数,我们在进行左儿子右兄弟的合并时,考虑一棵子树的根节点和其fa节点的合并,边就是连接这两个节点的边。这条边加上的值=子树黑点数(n-子树黑点数)+子树白点数(k-子树白点数)枚举子树黑点数,不断修正就可以了。#include<原创 2017-08-05 21:52:48 · 1078 阅读 · 2 评论 -
[KMP+矩阵快速幂加速]BZOJ 1009——[HNOI2008]GT考试
题目梗概给出一个不吉利数字A1A2...Am(0<=Ai<=9)有M位A1A2...Am(0<=Ai<=9)有M位。求有多少个n位数满足不包含不吉利数字。解题思路读完题目便能想到一个显然的数位DP,F[i][j]F[i][j]表示长度为i,有长度为j的后缀与不吉利数字匹配。考虑如何转移。发现所有失配到j的状态都可以转移,所以要提前用KMP构造,假设我们构造出矩阵T。但是发现还是超时。接下来我们考虑这原创 2017-08-14 20:32:01 · 582 阅读 · 0 评论 -
[压位DP]Hdu 6149——Valley Numer II
题目梗概给定一个无向图,图中的点存在高低。 定义山谷为:一个低点连接两个相邻的高点。 求不相交的山谷的最大个数。解题思路一看这个高点个数<=15高点个数<=15就马上想到压位DP。 i表示前i个点,j表示选择高点的状态,直接转移就可以了。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;con原创 2017-08-24 21:22:39 · 663 阅读 · 0 评论 -
[数位DP]Hdu 6148——Valley Number
题目梗概求1~n中满足题目要求的数的个数。题目要求:不存在一段下降之后上升的类似山谷的连续位置。解题思路不难想到是数位DP。预处理时f[i][j][k]f[i][j][k]表示长度为i,第一位为j的符合题目要求的个数。其中当k=1k=1表示出现过递增,否则没有。刷答案时注意贴着给出的数做,细节看代码(调了4个小时的血与泪啊)。#include<cstdio>#include<cstring>#i原创 2017-08-25 20:46:52 · 700 阅读 · 0 评论 -
[二分+DFS序上DP]BZOJ 4753—— [Jsoi2016]最佳团体
题目梗概题目给定一棵树,选K个节点。任意节点满足如果它被选其父亲也必须被选。使得价值与花费之比最大。解题思路这类题目显然是要二分的。最初的想法,在树上进行左儿子右父亲DP合并,这样每次check的效率是O(n^2)。但是怎么卡就是不过(我下面给出的就是树上合并的代码)。我将其归结为常数过大,记住其效率是稳定的。因此引进DFS序上DP,可以想象常数极小。fi,jf_{i,j}表示DFS序的前i个选择j原创 2017-12-05 20:19:11 · 838 阅读 · 0 评论