
动态规划
文章平均质量分 76
Ezereal
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) Minimization dp
题意给你个数组A和n,k,问你排列A后,下面的最小值是多少。题解先排个序,要填充像1,1+k,1+2k,1+3k....这样的序列,或像2,2+k,2+2k.......这样的序列,这些序列应该取排序数组中连续的一段才能使得答案最小,现在考察这些序列的大小,发现其大小要么是n/k,要么是n/k+1,所以可以dp[i][j]表示前 i 条序列我取了 j 个n/k这样的转载 2016-10-19 21:21:15 · 481 阅读 · 0 评论 -
Educational Codeforces Round 11 E. Different Subsets For All Tuples 动态规划★ ★
题意现在定义f(a)表示这个a串里面所有不相同的子序列的个数现在给你n,m,让你用字符集为m,去构造出长度为n的串然后让你算出所有f(a)的累加题解:考虑dpdp[i][j]表示长度为i,以字符j结尾的答案是多少dp[i][j]=sigma(dp[i-1][k]*2-dp[pre[j]-1][k])然后这个玩意儿显然对于任意的j的都是一样转载 2016-09-15 17:57:06 · 588 阅读 · 0 评论 -
CodeForces - 659G Fence Divercity (DP)★ ★ ★
题意:现在有n堵紧贴着的墙(墙是由砖块累成的),每堵墙都有一个高度,现在想将这n堵墙拆掉,并且拆墙有一定的规则,1、每堵墙都不能把最下面的那块砖拆掉;2、拆的砖头必须是连着的。问一共有几种拆法?//思路:dp[i][0]存放前i列的所有的情况数;dp[i][1]存放的是前i列全连通的情况数+第i+1列的情况数。#include#include#include#转载 2016-09-15 15:57:29 · 344 阅读 · 0 评论 -
hdu 5823 color II(状态压缩DP) ★
题意:给你一个图G,求每个子图的最少染色数思路:每个子图的染色问题,可以看成是找每个子图的独立集问题(两两顶点互不相邻的图叫独立集),可以先枚举每个状态,然后枚举每个顶点,表示以这个顶点为起始的子图,再枚举每个顶点,表示这个顶点和上面那个顶点所构成的图是一个独立集,预处理出所有非法的状态,即他们之间有边。 令dp[s]为子图S已经染色的最少染色数,那么有dp[s]=mi原创 2016-08-12 11:10:59 · 689 阅读 · 0 评论 -
HDU 2296 Ring (AC自动机+DP)
题目:给出m个模式串,每个串有一定的分值,构造一个长度不超过n的串,使得分值最大,输出长度最小,字典序最小的串明显的AC+DP,dp[i][j]表示长度为i的时候,在Trie上的第j个结点时的最大分值,path[i][j]表示状态(i,j)时的字典序最小的串。忘了考虑中间dp相等时还要更新字符串大小#include #include #include #include #i原创 2016-08-11 11:45:08 · 389 阅读 · 0 评论 -
629C-Famil Door and Brackets
题目大意:给你一个由括号组成的字符串,长度为m,现在希望获得一个长度为n(全由括号组成)的字符串,0题解:定义dp[i][j],为前缀长为i,且左括号数量-右括号数量=j的串有多少个,反过来也一样,最后dp*dp累加即可不过要判断给定串中左括号很大的情况#include #include #include #include #include #include #includ原创 2016-09-01 19:25:42 · 482 阅读 · 0 评论 -
HDU 3247 Resource Archiver(AC自动机+BFS+状态DP)
题目:给出n个资源,m个病毒,将资源串拼接成一个串,必须包含所有的资源串,可以重叠,但是不能包含病毒问最小的长度为多少将所有的资源串和病毒串都放在Trie树里建立起来,当然作上相应的标记。然后建立fail指针之后从资源串的结尾出发,BFS,记录能到达其它资源串结尾的步数。得到所有资源串结尾状态的距离邻接阵。之后是状态压缩DPdp[i][j]表示资源串的状态为i时,最后一原创 2016-08-08 16:27:13 · 359 阅读 · 0 评论 -
HDU 5816 Hearthstone (状压dp)
题目大概说有两种卡牌,使用A牌能从牌堆摸两张牌,使用B牌能对对方造成xi点伤害。在你的回合,你从牌堆摸一张牌,问能对对方造成p点及以上伤害的概率。要求的其实就是能造成p点以上伤害的牌堆排列数/牌堆全排列数。全排列而且总数为20,这种就该想到尝试用状压DP。。dp[S]表示已经摸的牌的集合为S的可行排列方案数对于一个状态S,我们能从这个集合中已经摸的牌知道还能摸几张,即A的数目原创 2016-08-10 09:34:57 · 470 阅读 · 0 评论 -
CROC 2016 - Elimination Round (Rated Unofficial Edition) E. Intellectual Inquiry 贪心 构造 dp
题意现在给你n,k和长度为m的串你需要构造一个长度为n+m的串,使得其中不同的子序列最多,输出数量。题解:构造题假设我们构造出来了,我们怎么去统计呢?dp[i]表示以i结尾的不同子序列数量,显然dp[i]=sigma(dp[j])+1,i!=j观察可以知道其实dp[i]=前面所有不同子串数量-以i结尾的子串统计知道了,我们怎么去构造呢?转载 2016-09-12 12:16:18 · 404 阅读 · 0 评论 -
8VC Venture Cup 2016 - Elimination Round F. Group Projects(DP)★ ★
题意:给n个人, 让我们分成若干组, 每组的值是最大值减去最小值, 求所有组的和。思路:显然, 需要用DP的思想, 但是该题DP设计的非常巧妙, 而且状态转移的情况容易考虑不全。我们用d[i][j][v]表示考虑了前i个数了, 有j个组是开放的(所谓开放指的是只有最小值, 还没有最大值, 还可以进人), 当前值之和为v 的方案数。我们先排序, 这样, 对于开放的组, 每次的转载 2016-08-30 16:07:48 · 802 阅读 · 0 评论 -
poj 1699 TSP(状态压缩DP + KMP)
题意:给你n个串,让你构造出一个最短的串,使得这n个串每个串都是这个串的子串,输出你构造的串的长度即可(如果要输出构造的串中字典序最小的,就有点难了)数据范围小,不一定要使用KMP预处理的分两步:1:预处理出一个串的前缀最多匹配多少长度的另一个串的后缀2:然后就相当于旅行商问题了,每两个串之间都有一定的距离,设dp[i][j]表示i状态的字符串,最后一个字符串为j时所构造的转载 2016-08-09 10:21:38 · 509 阅读 · 0 评论 -
HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)
题意: 终于放寒假了,小明要和女朋友一起去看电影。这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: 1、假设小明在的位置是1号点,女朋友在的位置是n号点,则他们之间有n-2个点可以走,小明每次走的时候只能走到比当前所在点编号大的位置; 2、小明来的时候不能按一定的顺序经过某些地方。比如,如果女朋友告诉小明不转载 2016-08-08 09:19:42 · 675 阅读 · 0 评论 -
2016 ACM/ICPC Asia Regional Qingdao hdu5890 Eighty seven(DP+bitset优化妙用)
题意:50个数,10W个询问,每次问删掉第i,j,k个数后,是否存在一种选10个数和为87的方案,只需要输出 ’Yes’ 或者 ’No’题解:暴力:不同的询问大概2W个,每个暴力bitset DP,抠一抠能卡着过。优化1:先求出一组解,如果询问和解没交就是’Yes’,否则暴力,不同的询问大概1W个;优化2:先预处理出所有询问的答案,能方便的复用之前的DP数组,不用每次从头开始重新求。转载 2016-09-18 18:44:33 · 408 阅读 · 0 评论 -
Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks(矩阵优化DP)★
转载自:http://blog.youkuaiyun.com/weizhuwyzc000/article/details/50618417题意:给n个数作为一个块,有b个块,从其中若干个中选择数,每个块只能选一个数,最后组成一个数模x等于k的方法数。思路:很容易想到这样一个DP方程 : 用dp[i][j]表示现在i位,余数是j。那么很容易知道,边界是d[0][0] = 1;那么dp[i][j]转载 2016-08-26 21:29:09 · 1037 阅读 · 0 评论 -
uva 11404 Palindromic Subsequence(LCS回文串,最小字典序)
题目大意给一个字符串,输出它的最长回文串,如果有多个结果,输出字典序最小的。我们都知道把一个字符串逆序后和原字符串进最长公共子序列,可以计算出它的最长回文串长度。但是这题不仅要输出回文串,而且还要求是字典序最小的,所以挺难搞的。设str1是正序字符串,str2是逆序后的字符串f[i][j].len 表示str1的前i位,str2的前j位,最长公共子串的长原创 2015-09-26 18:06:28 · 627 阅读 · 0 评论 -
Codeforces Round #360 (Div. 2) E The Values You Can Make(DP)
题意:问你凑出K的所有子集C之和思路:令dp[i][j][k]为用第i个凑出j的子集之和为k是否可行 然后dp[i][j][k]|=dp[i-1][j][k],dp[i][j][k]|=dp[i-1][j-c][k],dp[i][j][k]|=dp[i-1][j-c][k-c]直接搞就好了注意:会爆内存,改用bool或者滚动数组就好了#inclu原创 2016-10-08 10:09:32 · 300 阅读 · 0 评论 -
Codeforces Round #358 (Div. 2) D. Alyona and Strings dp
题意给你两个串,s和t,现在要你在s中找k个不相交的子串,然后在t中这k个都出现,而且顺序和在s中一致,让你最大化长度和题解:从数据范围一看,应该是一个nmk的dpdp[i][j][k][0]表示s中第i个等于t中第j个,一共匹配了k段后,且继续往下延续,这时候的总长度为多少。dp[i][j][k][1]表示匹配了k段后,不往下延续的答案是多少然后像LCS一样转移就好了。转载 2016-10-07 13:47:11 · 257 阅读 · 0 评论 -
Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E. Goods transportation 动态规划
题意给你n个城市,每个城市都可以往编号比自己大的城市运送c容量为物品每个城市可以生产最多p[i]物品,最多售卖s[i]物品然后问你这n个物品,最多卖多少物品,一共。题解:如果数据范围小的话,那么显然是网络流,直接莽一波就好了但是这个过不了。考虑最大流等于最小割,我们可以考虑dp[i][j]表示考虑i个点,我们割掉了j个汇点的最小花费。那么转载 2016-10-18 16:29:22 · 380 阅读 · 0 评论 -
Codeforces Round #374 (Div. 2) C. Journey DP
题意:给你一个n点m边的图,让你从1走到n,找到一条经过尽量多点的路径,且路径边权和小于等于T然后输出路径。题解:直接DP,DP[i][j]表示在j点,当前经过了i个点的最小代价是多少#include #include #include #include #include #include #include #include #include原创 2016-10-18 12:38:21 · 296 阅读 · 0 评论 -
斜率优化+单调队列优化DP
转载自:http://blog.sina.com.cn/s/blog_508dd1e60100tvk0.html 今天做了一道DP的题目,题意如下:【题目大意】有N个数,现要将它们分成连续的若干段,每段的代价为(∑Ci)^2+M,求最小的代价。【题目分析】容易得到这样的一个动态规划算法:令dp[i]表示前i个数分成若干段的最小代价,能得到一个经典的动态转移方程:转载 2016-09-07 16:11:12 · 727 阅读 · 0 评论 -
HDU 5903 - Square Distance (贪心+dp)
题意: 给一个字符串t ,求与这个序列刚好有m个位置字符不同的由两个相同的串拼接起来的字符串 s, 要求字典序最小的答案 分析: 把字符串折半,分成0 - n/2-1 和 n/2 - n-1 dp[i][j] 表示 第i位及之后的总代价为j可不可行 从第 n/2-1 位推回第 0 位, 若dp[0][m] = 1,则存在转载 2016-10-01 14:32:04 · 408 阅读 · 0 评论 -
codeforces 713C(Round #371 Div2 E) Sonya and Problem Wihtout a Legend ★ ★
题目描述:给出一个包含n个数的序列a1,a2,...,an,先要把该序列修改成严格单增的序列,假设修改成 b1,b2,...,bn的花费为 |a1 - b1|+|a2 - b2|+...+|an - bn|,问最小花费是多少?方法:非常类似于POJ3666,建议先把这道题AC,为了转化成POJ3666,需对性质进行如下分析:严格递增的含义是a[j] - a[i] >= j -原创 2016-10-15 22:01:46 · 776 阅读 · 0 评论 -
Codeforces Round #370 (Div. 2) D. Memory and Scores 动态规划
题意有两个人在玩游戏,一开始分数分别为a和b,每一局,每个人可以获得分数[-k,k]之间,问你A胜过B的方案数有多少种题解:dp[i][j]表示第i轮之后,获得j分数的方案数。显然这个只会和上一轮有关,所以可以滚动数组优化,又显然可以前缀和优化。然后维护一下DP最后再枚举A的分数,统计一下答案就好了。#include #include #in转载 2016-10-15 20:40:26 · 300 阅读 · 0 评论 -
CodeForces Round #365 Div.2 E.Mishka and Divisors ★ ★ ★
题意:给定一个最多个数的序列,从中选出最少个数的数字,使得他们的乘积是k的倍数,若有多种选择方式,输出选出数字和最小的一种,若有多种,输出任意一种。题解:动态规划,dp[i][j]表示从前i个数里选,所得乘积是j的倍数。显然dp[i][j]=max(dp[i-1][j],dp[i-1][j/gcd(j,a[i])])。由于k可能很大,所以只需令j分别等于k的每个约数即可。确定k的约转载 2016-10-12 20:50:42 · 425 阅读 · 0 评论 -
2014 北京区域赛 F Fluorescent HDU5117 (数学+状压+dp)★ ★
题意:有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态;问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和思路:1、首先注意到N2、最开始考虑的是算出每种情况下对应的方案数,然后依次dp,但是数据量太大;3、正解是直接考虑X^3,其中X就是每种状况下亮着的灯的数量;4、如何解这个X^3?我们把它展开——X转载 2016-09-26 22:40:22 · 530 阅读 · 0 评论 -
HDU 4784-Dinner Coming Soon-BFS
在k个平行空间中,n个点,由m条有向边连接起来,每条边有一个时间花费和金钱花费,同时,在每个点上,可以跳转到(ki+1)%k 的空间里,不同空间的边权值不变。另外,在每到达某个空间的某个顶点时,可以买一包盐,卖一包盐,或者什么也不做,买卖的时间不考虑。相同的顶点在不同的空间中盐的价格也不一定相同..现在给定顶点数n,边数m,盐的最大携带量b,空间数k,初始的金钱r,规定的时间t,问怎么走可以在t时转载 2016-09-26 18:09:18 · 338 阅读 · 0 评论 -
HDU4758 Walk Through Squares(AC自动机+状压DP)
题目大概说有个n×m的格子,有两种走法,每种走法都是一个包含D或R的序列,D表示向下走R表示向右走。问从左上角走到右下角的走法有多少种走法包含那两种走法。D要走n次,R要走m次,容易想到用AC自动机上的DP解决:用两种走法的序列构造AC自动机dp[i][j][S][k]表示D用了i个R用了j个,且当前走到自动机的S结点,已经包含的走法的状态集合是k的方案数转移就是走R或者走D了,我用我原创 2016-08-08 09:19:22 · 334 阅读 · 0 评论 -
codeforces 624d 623b Array GCD ★ ★
题意:有两种操作,每种只能用一次,第一种对于一段连续区间进行移除(不能全删完),代价是长度*a,第二种是对于一些数进行+1或者-1,使得最后的剩余的最大公约数大于1思路:由于不能全删完,所以至少会有一个数留着,这个数肯定会是头一个或最后一个,最大公约数肯定是在选中的这个数最后状态中的一个约数,而我们只要先枚举这个数是多少(一共6种),然后枚举他的素因子,用dp顺推即可。#inclu转载 2016-08-29 14:59:44 · 581 阅读 · 0 评论 -
HDU 2577 How to Type(DP)
题意:要求一个字符串输入,按键盘的最少次数。有Caps Lock和Shift两种转换大小写输入的方式思路:用dpa与dpb数组分别记录Caps Lock的开关状态#include #include #include #include #include #include #include #include #include #include #include #原创 2016-07-29 14:19:41 · 290 阅读 · 0 评论 -
hdu1505 City Game (最大子矩阵)
这题是HDU1506 的加强版,只要把算出以i 行为底能达到的最到的最大高度,再扫描每一行,就转化为 HDU1506 的问题了,即算出以此点为最低点能两边延伸的最大距离,最大延伸距离乘以该点的高度就是面积了,HDU 2870 则是此题的加强版#include #include #include #include #include #include #include原创 2016-07-29 10:47:08 · 285 阅读 · 0 评论 -
hdu 1506 Largest Rectangle in a Histogram (最大子矩阵)
题意:容易理解...分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1;我们从左到右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了。#include #include #include #include #原创 2016-07-29 10:17:46 · 273 阅读 · 0 评论 -
POJ 1742 Coins (多重背包)
题意:有n种面额的硬币,面额个数分别为A_i、C_i,求最多能搭配出几种不超过m的金额?题解:看了别人代码敲完#include#include#include#include#include#include #include #include #include #include #include #define INF 0x3f3f3f3f#define maxn原创 2015-08-22 12:54:57 · 758 阅读 · 0 评论 -
POJ 1631 Bridging signals(LIS)
题意:一道最长上升子序列,不过数据较大题解:n2的话会超时,因此采用O(nlog(n))算法,dp[i] 表示长度为i的上升子序列末尾最小值,len记录当前长度最大值,采用二分查找在dp[i]中寻找大于a[i] 的最小值并且替换代码:#include #include #include using namespace std;#define maxn 40010int n,l原创 2015-08-25 19:10:56 · 408 阅读 · 0 评论 -
UVa 11795 Mega Man's Mission(集合动态规划)
本文出自:http://blog.youkuaiyun.com/dr5459题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2895题目意思:告诉你初始时可以杀掉那些机器人你每杀掉一个机器人,就可以拿起他的武器,从而原创 2015-09-26 18:37:04 · 561 阅读 · 0 评论 -
Codeforces Round #338 (Div. 2) C. Running Track(DP)
题意:给你两个字符串a和b,让你用a中的子串来构造b(a中的子串可以旋转),让你输出构成方案。思路:做了好久好久,最终还是借鉴了大神的思路过的。此题实现的方法有很多,字典树、KMP、DP都可以做,据说直接暴力也是能过的…首先根据字符串a正序逆序跑一遍和b的公共子串,分别存到dp1和dp2中。dp1[i][j] (dp2[i][j])表示能从当前位置往前匹配长度为dp1[原创 2016-05-21 22:29:24 · 501 阅读 · 0 评论 -
2016"百度之星" - 初赛(Astar Round2A)Sitting in Line(★)
度度熊是他同时代中最伟大的数学家,一切数字都要听命于他。现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了。游戏的规则十分简单,参与游戏的N个整数将会做成一排,他们将通过不断交换自己的位置,最终达到所有相邻两数乘积的和最大的目的,参与游戏的数字有整数也有负数。度度熊为了在他的数字仆人面前展现他的权威,他规定某些数字只能在坐固定的位置上,没有被度度熊限制的数字则可以自由地交换位置。原创 2016-05-21 22:20:24 · 1226 阅读 · 0 评论 -
HDU 5617 Jam's maze(dp)
题意:从(1,1)走到(n,n),走过的路形成一个字符串,问有多少个是回文。思路:可以想着有两个人分别从(1,1)(1,1)和(n,n)(n,n)开始走,然后走到相遇,状态转移就很显然,相遇时把四个方向都扫一下即可。所以我们定义状态可以定义为f[x_1][y_1][x_2][y_2]f[x1][y1][x2][y2]表示所对应的两个点(x_1,y_1)(原创 2016-05-03 16:25:14 · 363 阅读 · 0 评论 -
CodeForces 431C k-Tree
题目大意:满k叉树,每个顶点有k条边,边的权重为1~k,现求出从根节点出发,有多少条路径,使得总权值恰好为N,并且每条路径上至少有一条权值不少于d的边。题目思路:dp[i][h],第一个参数从1-n,遍历权值为i的情况,h有两种情况,0和1,0表示权值为i的所有情况,1表示权值为i的时候路径中存在一个值大于d的情况。状态转移方程://权值为i的处理所有情况 dp[原创 2016-03-27 17:52:59 · 513 阅读 · 0 评论 -
CodeForces 332B Maximum Absurdity
题目大意:给出一个序列,让找出不互相覆盖的两个长度为k的段,问在两个段的权值和最大的情况下,按照左边段的左端点排序,右边段的左端点作为第二关键字排序,得到的第一个答案。题目分析:dp:dp1[maxn],dp2[maxn]; dp1【i】表示前i项连续k段最大值,dp2【i】表示后n-i项连续k段最大值,然后做一次循环就好#include #i原创 2016-03-27 18:58:00 · 539 阅读 · 0 评论 -
hdu 2844(多重背包:0/1背包+二进制转化)★
模型:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不跨越背包涵量,且价值总和最大。办法:根蒂根基算法这题目和完全背包题目很类似。根蒂根基的方程只需将完全背包题目的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。转载 2016-07-29 14:57:40 · 697 阅读 · 0 评论