随笔分类 - 动态规划(DP)
CodeForces 478D Red-Green Towers (DP)
摘要:题意:给定 n 块红砖,m 块绿砖,问有多少种方式可以建造成最高的塔,每一层颜色必须一样。 析:首先要确定最高是多少层h,大约应该是用 h * (h+1) <= (m+n) * 2,然后dp[i][j] 表示 前 i 层用 j 块红砖,dp[i][j] += dp[i-1][j-i], 但是这个空间
阅读全文
LightOJ 1422 Halloween Costumes (区间DP)
摘要:题意:给你n天要穿的衣服,可以套着穿,但是一旦脱下来就不能再穿,问这n天最少需要准备多少件衣服。 析:dp[i][j] 表示第 i 天到 第 j 天最少要穿多少这衣服,对于第 i 天的衣服,可以是以后不用的那就是dp[i][j] = dp[i+1][j] + 1。 或者是第 k 又用,dp[i][j
阅读全文
CodeForces 402D Upgrading Array (数学+DP)
摘要:题意:给出一个数列,可以进行一种操作将某一个前缀除去他们的gcd,有一个函数f(x),f(1) = 0 , f(x) = f(x/p)+1,f(x) = f(x/p)-1(p是坏素数), 求 sum(f[a[i]]) 的最大值。 析:因为f(1) = 0,否则如果是好素数,那么就加一,如果是坏素数就
阅读全文
CodeForces 404D Minesweeper 1D (DP)
摘要:题意:给定一个序列,*表示雷,1表示它旁边有一个雷,2表示它旁边有两个雷,0表示旁边没有雷,?表示未知,求有多少情况。 析:dp[i][j] 表示第 i 个放 j 状态,有多少种情况,然后很简单的DP就可以搞定。 代码如下:
阅读全文
UVa 1204 Fun Game (状压DP)
摘要:题意:有一些小孩(至少两个)围成一圈,有 n 轮游戏,每一轮从某个小孩开始往左或者往右伟手帕,拿到手帕写上自己的性别(B,G),然后以后相同方向给下一个。 然后在某个小孩结束,给出 n 轮手帕上的序列,求最少有多少个小孩。 析:很容易知道是状压DP,也很容易写出状态方程,dp[s][i][j] 表示
阅读全文
HDU 3001 Travelling (状压DP + BFS)
摘要:题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次。现在给出城市之间的来往路费,他可以选择任意一个点为起点。 问逛遍所有城市的最低路费是多少。 析:用三进制表示每个城市的访问次数,然后 bfs 进行遍历,不过要注意这个题卡内存,必须要去年一些无用的状态,要不然会超内存的,还
阅读全文
POJ 1795 DNA Laboratory (贪心+状压DP)
摘要:题意:给定 n 个 字符串,让你构造出一个最短,字典序最小的字符串,包括这 n 个字符串。 析:首先使用状压DP,是很容易看出来的,dp[s][i] 表示已经满足 s 集合的字符串以 第 i 个字符串结尾,他很容易就求得最短长度,但是这个字符串怎么构造呢, 由于要字典序最小,所以就不好搞了,挺麻烦的
阅读全文
POJ 2836 Rectangular Covering (状压DP)
摘要:题意:平面上有 n (2 ≤ n ≤ 15) 个点,现用平行于坐标轴的矩形去覆盖所有点,每个矩形至少盖两个点,矩形面积不可为0,求这些矩形的最小面积。 析:先预处理所有的矩形,然后dp[s] 表示 状态 s 时,最少需要的面积是多少。 代码如下:
阅读全文
POJ 2441 Arrange the Bulls (状压DP)
摘要:题意:n头牛,m个位置,每头牛有各自喜欢的位置,问安排这n头牛使得每头牛都在各自喜欢的位置有几种安排方法。 析:dp[i][s] 表示前 i 头牛,已经占的位置是 s,有多少种安排方法,其他的就很简单了,注意用滚动数组 。 代码如下:
阅读全文
POJ 2411 Mondriaan's Dream (状压DP)
摘要:题意:给出一个n*m的棋盘,及一个小的矩形1*2,问用这个小的矩形将这个大的棋盘覆盖有多少种方法。 析:对第(i,j)位置,要么不放,要么竖着放,要么横着放,如果竖着放,我们记第 (i,j)位置为0,(i+1,j)为1,如果横着放,那么我们记 (i,j),(i,j+1)都为1,然后dp[i][s]表
阅读全文
POJ 2686 Traveling by Stagecoach (状压DP)
摘要:题意:有一个人从某个城市要到另一个城市, 有n个马车票,相邻的两个城市走的话要消耗掉一个马车票。花费的时间呢,是马车票上有个速率值 ,问最后这个人花费的最短时间是多少。 析:和TSP问题差不多,dp[s][i] 表示当前在第 i 个城市,还剩余集合 s的票,需要的最短时间。状态转移方程: dp[s]
阅读全文
POJ 1185 炮兵阵地 (状压DP)
摘要:题意:中文题。 析:dp[i][s][t] 表示第 i 行状态为 s, 第 i-1 行为 t,然后就很简单了,但是要超内存,实际上状态最多才60个,所以后两维开60就好, 然后又超时间,就一直加优化,提前预处理。 代码如下:
阅读全文
POJ 3254 Corn Fields (状压DP)
摘要:题意:给定一个n*m的01矩阵,然后求有多少种方式,在1上并且1不相邻。 析:一个简单的状压DP,dp[i][s] 表示 第 i 行状态为 s 时有多少种,然后只要处理不相邻就行了,比赛进位运算写错了一个地方。。。。。 代码如下:
阅读全文
HDU 2476 String painter (区间DP)
摘要:题意:给定两个串,问你从第一个串刷成第二个串最少要几次。 析:我们可以先求一个空串变成第二个串,然后再求第一个串的,dp[i][j] 表示 i-j 这个区间已经和第二个串相同了,最少要几次,区间dp么, 然后再求和第一个的。 代码如下:
阅读全文
CodeForces 279C Ladder (RMQ + dp)
摘要:题意:给定一个序列,每次一个询问,问某个区间是不是先增再降的。 析:首先先取处理以 i 个数向左能延伸到哪个数,向右能到哪个数,然后每次用RQM来查找最大值,分别向两边延伸,是否是覆盖区间。 代码如下:
阅读全文
URAL 2018 The Debut Album (DP)
摘要:题意:给出n长度的数列,其实1的连续个数不超过a,2的连续个数不超过b。 析:dp[i][j][k] 表示前 i 个数,以 j 结尾,并且连续了k个长度,要用滚动数组,要不然MLE。 代码如下:
阅读全文
POJ 3691 DNA repair (DP+字符串)
摘要:题意:给出nn(1≤n≤50,1≤n≤50) 个病毒DNA序列,长度均不超过20。现在给出一个长度不超过1000的字符串,求至少要更换多少个字符, 才能使这个字符串不包含这些DNA序列。 析:利用前缀来做好状态转移。 代码如下:
阅读全文
UVa 11468 Substring (AC自动机+概率DP)
摘要:题意:给出一个字母表以及每个字母出现的概率。再给出一些模板串S。从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机,然后随机生成L个字母,就是在AC自动机的某个结点走多少步,dp[i][j] 表示在 i 结点,并且剩
阅读全文
HDU 5860 Death Sequence (递推)
摘要:题意:n个人排成一行,从第一个人开始,每个k个人报数,报到数的人被杀死,剩下的人重新排成一行再报数。一共q个询问,每次询问第qi个死的人是谁。 析:是一个约瑟夫的变形,我们要考虑子问题的问题同样编号是0-n-1,如果在某一轮,第 i 个人如果能取模 k 为0,那么这一轮他就会被干掉,如果不是 那么下
阅读全文
POJ 3616 Milking Time (DP)
摘要:题意:奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶, 求Bessie最大的挤奶量。 析:一个很水的DP,就是不能再表示时刻了,而是区间,dp[i] 第 i 个区间 最大是多少。 代码如下:
阅读全文