dp
文章平均质量分 84
luckyone2014
想思路是苦涩艰辛的,但是打代码是愉快的。
展开
-
hdu 4901 The Romantic Hero 计数dp,位计算
题意是 给n个数.前面取任意个数 组成集合S 取在所有S中元素后面的任意个元素 T ,S 和T 不为空集;计算能让S集合所有元素的异或(^)后得到的数等于 T集合所有元素与(&)后得到的数. 这样取两个集合,不同的取法有多少个.data[ i ][ j ]表示在i号元素以前,包括i, 能通过^运算得到j的方法数data2[ i ][ j ]表示在i号元素以后,包括i,能通过&运算得到j的方法数data3[ i ][ j ] 表示在i号元素以后,包括i,能通过&运算得到j,且一定取了i原创 2014-08-04 11:02:46 · 849 阅读 · 0 评论 -
hdu 5092 Seam Carving dp+记录路径
题意:求一条路线,从矩阵的顶到矩阵的底,只能走到左下方,正下方,右下方。问总和最小的走法。 输出从第一行到最后一行每行走的点的列标。要求相等的情况下,选最右边的路线。做法:dp就好了,读懂题就不难了。因为路径从第一行开始的,所以我把输入的矩阵上下颠倒了。然后除了第一行的的 dp值 赋值成输入的以外,都初始化为INF。 然后转移过来后,如果从右边,就dir[i][r]=1, 中间0 ,左边-1。注意要先更新右边的,因为要选最右边的路线。然后dp好了从最后一行 中选出最小的,相等的话取最右边的,原创 2015-05-05 21:44:55 · 945 阅读 · 0 评论 -
hdu 5098 Smart Software Installer 拓扑排序or记忆化搜索
题意: 第一行 案例数。 然后每个案例用空行隔开。每个案例都有若干行 ,第一个单词表示一个软件,如果名字后面有*号,代表安装这个软件需要重启。 多个软件可以同时 一次重启 安装。然后冒号后面 表示安装这个软件需要先安装的软件。做法:有两种做法,不过都需要先建图。用get函数来把字符串变成编号。 id 表示冒号前的软件,fu表示冒号后面的软件。要把 id 存入 vector son[fu], 就像树一样存。然后把 id的入度++;第一种做法,拓扑排序。把入度为0的 且不需要重启的 存入q1队列原创 2015-05-07 21:30:40 · 898 阅读 · 0 评论 -
hdu 4389 X mod f(x) 数位dp
题意:相当于问区间内有多少数满足 X%(∑xi)==0。∑xi 是数字X的数位和。做法:因为最多9位数,所以可以枚举∑xi,最大为81。 然后就是数位dp了。sum是数位和,nwmod是取模结果,mod 是枚举的模当数位和sum==mod而且,nwmod最后==0,成立计数。原创 2015-07-09 14:50:20 · 1075 阅读 · 0 评论 -
hdu 5282 Senior's String 两次dp
定义L为X与Y的最长公共子序列的长度(子序列在字符串内不一定连续,一个长度为L的字符串有2L个子序列,包括空子序列)。现在学姐姐取出了X的所有长度为L的子序列,并要求学弟回答在这些子序列中,有多少个是Y的子序列。原创 2015-07-12 11:23:47 · 1360 阅读 · 0 评论 -
LightOJ 1295 Lighting System Design dp
题意:有若干个灯,每个灯有四个值V 该灯泡的电压,可以买电压高的灯泡代替电压低的灯泡。 电压两两不同K 发电机价格,只有有一台,就可以供应无限多个该电压的灯泡。C 灯泡价格L 这个电压的灯泡需要多少只问买完所有要求的灯泡的最小花费做法因为高电压可以代替低电压的灯泡,所以高电压可以后判断要不要买发电机。所以先按电压排个序,那么就是后面一定可以代替前面的了。预处理下灯泡数的前缀和 sum数组。然后for两层,dp[i]=min(dp[i],dp[j]+la[i].k+la[i]原创 2015-07-15 20:18:50 · 1320 阅读 · 0 评论 -
ZOJ 2771 Get Out of the Glass 很普通的计数dp
题意:玻璃一共有3层从上方射入玻璃后(不能在最上面直接反射出去,必须先进入玻璃),问n次折射的走法有多少种。dp[i][j] i代表第几次折射 奇偶可以判断向上走还是向下。j代表当前在第几层。虽然c++也能过 但是其实会爆 llu的。原创 2015-07-15 20:54:49 · 518 阅读 · 0 评论 -
hdu 4507 吉哥系列故事——恨7不成妻 数位dp
做法:dp[i][j][k] 表示pos位之后 当之前的的 位数和%7 ==j 之前的 十进制数在pos位之前%7 == k 的 数的平方和。开个结构体 ,表示这个dp 状态的 答案存在 fang里, 然后有多少个数 存在 ge里, 这些数的和 存在 sum里。然后 算式推下,转移下。原创 2015-09-04 13:08:44 · 644 阅读 · 0 评论 -
hdu 4734 F(x) 数位dp
题意:问 0到b 之间有多少x符合 F(x)<=F(a)做法:数位dp之前想到的状态,第二维sum 代表 这位之前 二进制数 加和是 sum, 这位及之后 有多少种数 二进制加和 + sum<=F(a)然后超时了一发,加了个999的剪枝,200ms 过了。原因是里的dp意义和F(a)有关,所以每次要清空数组后来看了别人的,发现原来很简单,正确的状态 sum 表示 这位及之后 有多少种数 二进制 加和<=sum这里的dp值是固定的,每次不用清空,所以速度快很多。原创 2015-09-03 19:12:17 · 511 阅读 · 0 评论 -
hdu 3045 Picnic Cows 斜率优化 dp中有间隔限定
题意:有n头牛,选若干个集合,每个集合中至少要有T头牛。 要求把集合中 欢乐值高的 降到全一样。问最少要降多少。做法:分组肯定接近的数分一起,所以可以先排个序。然后 dp[i]表示 前i头牛 需要最少降多少欢乐值,使其达到要求。dp[i]=min{dp[j]+sum[i]-sum[j]-(i-j)*num[j+1];可以推出:y(j)=dp[j]-sum[j]+j*(num[j+1])x(j)=num[j+1] 在这种集合有个数要求的斜率优化中,在优化第i个时,入队是 入 i-k原创 2015-09-04 09:45:58 · 682 阅读 · 0 评论 -
spoj 10606 BALNUM - Balanced Numbers 数位dp
题意:问A到B之间有多少个数,有多少数 符合以下两个条件。数位0-9 中 ,每一个奇数数位有 偶数个, 偶数数位有奇数个。也就是如果有1 的话,那必须有偶数个1。如果有2的话,必须有奇数个2,当然没有也可以。做法:弄个三进制记录状态,表示0-9 数位,各个数位出现过没有,没有出现在对应的三进制位标记0,出现奇数次 标记1, 出现偶数次标记2。注意前导零是不能算的。原创 2015-09-05 10:30:29 · 1422 阅读 · 0 评论 -
hdu 2870 Largest Submatrix 最大子矩阵
题意:有若干种 转换字母的方法,问转化后 可以得到的 最大相同字母矩阵 是多大。 矩阵大小= n*m做法:全转成a,然后不能的位子是0,可以的位子是1。然后 deal 里就是一维的最大矩阵 的处理了。 是一种dp。 做法和一维的 hdu 1506 差不多。然后再把 全是 b和c 的求出来 求最大值就好了。原创 2015-09-14 21:47:40 · 922 阅读 · 0 评论 -
FZU 2204 7 dp+预处理
做法 :dp 一维记录 轮到第几个点了,二维记录 当前连续最长有几个黑色,或者白色,第三维记录 黑色还是白色。枚举开头是黑色的话,枚举有几个黑的,然后dp过去。对于每个i,当末尾和开头黑色的合 不超过6, 就把答案加到real里面。把所有答案预处理出来。原创 2015-10-06 19:04:22 · 680 阅读 · 0 评论 -
hdu 1561 The more, The Better 树状DP
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?做法:设一个0节点,自身价值是0,dp[i][j]表示第i个节点,取了j个节点后的价值。因为先取父亲才能取儿子,所以要从dp[i][1] 开始转移。把子节点的状态转移到父亲节点。因为和分组背包一样,子节点不能重复更新父亲原创 2015-04-30 22:00:48 · 687 阅读 · 0 评论 -
hdu 4597 Play Game 记忆化搜索 区间dp
题意:给你两摞牌,每次可以任意一堆 的牌头或者牌尾抽牌。Alice先抽,Bob后抽,两个人都想抽到最多点数的牌。做法:dp[az][ay][bz][by]。 az,ay代表第一堆牌左边 和右边 分别抽到第几张了。然后在这个状态下 Bob抽到的点数。因为dp表示的Bob的点数,所以牌堆里剩余奇数张牌的时候,是Bob抽,要取各种抽法的最大值。如果只剩偶数张牌,那么是Alice抽,要取 各种抽法中 的最小值。原创 2015-05-09 22:02:25 · 845 阅读 · 0 评论 -
poj 3311 Hie with the Pie dp+状压
题意从0出发送汉堡,送完每个点后回到0点矩阵 表示各个点间距离。思路因为可以各个点多次经过,所以先求下floyd 来更新点点之间最短距离。把每一步,到各个点的状态和最后一步所在的位置还有所花的距离保存下来。把最后到的各个地方,再加个回零点的距离。求个最小值。 dp[15][15] 一维表示已经走的步数,二维表示当前最后一步到的点。 map的x表示状态,y表示已经花费的时间。原创 2014-11-08 09:55:33 · 914 阅读 · 0 评论 -
hdu 1059 Dividing 多重背包
Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the marbles had the same value, because then they could just split the collection原创 2015-01-26 16:18:24 · 706 阅读 · 0 评论 -
zoj zju 2994 Tiling a Grid With Dominoes 状压dp
题意,4*w的矩形放满1*2的矩形可以有多少种放法从左往右状压dp。状态中的1表示横着放,且要占用该行下一列一格。0表示这个状态正好放满这列。原创 2015-01-28 22:21:18 · 878 阅读 · 0 评论 -
foj 2109 Mountain Number 位数dp
题目链接 Problem 2109 Mountain Number Accept: 139 Submit: 357Time Limit: 1000 mSec Memory Limit : 32768 KB Problem DescriptionOne integer number x is called "Mountain Number" if:原创 2014-12-05 20:12:23 · 1022 阅读 · 0 评论 -
hdu 1069 Monkey and Banana dp
Monkey and BananaTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8225 Accepted Submission(s): 4243Problem DescriptionA gr原创 2015-01-29 20:59:18 · 455 阅读 · 0 评论 -
1142 Relations dp n个数的不同大小关系总数
题意: 输入一个n。代表有n个数。输出他们所有的不同关系 有多少种。做法:开一个dp[ i ][ j ] i表示当前状态有几个字母,j表示当前状态有多少个不同的数 (也就是小于号+1)。如:a < b < c a < c < b b < a < c b < c < a c < a < b 上面这些是有 有两个等于的状态, 如果想再加一个不同于a,b,c的一个数d。 拿a < b < c 来说,可以有4种方法 d<a<b<c或者 a <d< b < c 或原创 2015-02-12 10:57:18 · 780 阅读 · 0 评论 -
hdu 1024 Max Sum Plus Plus 一串数字中,m段连续数字最大和 滚动数组+dp
题意:给你n个顺序排列的数字, 要求你找m段数字和,要求这m段数字和 的和 最大。 一段数字最少包含一个数。做法: 滚动数组 dp。 dp[i][j][k], i表示第几个数,因为计算第i个数的时候只需要考虑第i-1个数 达成的情况。所以这一维可以用滚动数组。j表示 已经有几段数字了。 k表示第i个数字取了,或者没有取。 取不取的区别在于,如果取了那么可以继续在这个段里添加数字,如果没有取,那么下一个数字如果添加进来,那么肯定是有了新的一段。 状态转移方程:当前要是不取,那么可以直接从上一个数字的原创 2015-03-26 22:31:15 · 847 阅读 · 0 评论 -
hdu 1494 跑跑卡丁车 dp
一道dp题目。注释里是第一次打的代码,用了二维来记录状态。后来看了题解,就把time 一维 用来 做滚动数组。 然后把20%NO记做1。一张卡 记做5。这样只用一维,比较简单。 按要求写出状态方程。加速的时候time[cur][k]=min(time[cur][k],time[cur^1][k+5]+b[j]); 不加速的时候 time[cur][k]=min(time[cur][k],time[cur^1][k-1]+a[j]); 注意,如果两张卡,而且有80%的NO的时候原创 2015-03-08 08:59:15 · 1008 阅读 · 0 评论 -
hdu 1501 Zipper 记忆化搜索
题意:输入三个字符串,aa,bb,cc。 cc是由aa和bb组成的。但是aa和bb在cc中的原顺序不变。问cc是否可以由aa和bb构成。做法:dfs,要记录状态。先拿aa的当前字母去试,能匹配cc的当前字母,就继续搜下去。不能的话搜索bb当前字母和cc的当前字母是否匹配。原创 2015-03-09 22:08:25 · 702 阅读 · 0 评论 -
lightoj 1110 - An Easy LCS 最长公共子序列+string
题意:找出最长公共自序列,有一样长的取字典序小的。如果lcs长度为0,输出哭脸。做法:在最长公共子序列基础上,每次dp的时候 判断下两个string的字典序大小。最长公共子序列的复杂度是100*100,字符串最长是100,O(10^6)。原创 2015-03-29 10:21:36 · 809 阅读 · 0 评论 -
lightoj 1326 - Race dp+预处理
题意:问n匹马赛跑,一共有多少结局。两匹马有三种结局1. Both first2. horse1 first and horse2 second3. horse2 first and horse1 second做法:dp[i][j] i代表有几匹马,j代表有多少团。把一样快的马放在一个团里。 按团算 ,两匹马 有 两种, 平局 一个团,dp[2][1]计数1,不平局,有两个团,dp[2][2]计数2。 三匹马的时候,dp[3][1]=dp[2][1]原创 2015-03-29 10:45:33 · 1057 阅读 · 0 评论 -
zoj 3605 Find the Marble 计数dp
题意:有n个盒子,有个宝石在第s个盒子中。第一个个人做m次交换操作,第二个人只看到其中的任意k次操作,每个操作被看到的几率是一样的。问第二个人最可能猜这个宝石在几号盒子。做法:dp算方法数。 dp[i][j][k],i表示真实的操作了几次,k表示第二个人看到了几次操作,j表示第几个盒子,dp的值表示这种情况下第一个人有多少种情况会猜宝石在j盒子中。初始化dp[0][s][0]=1,开始操作数为0时,肯定猜的是在第s个盒子中。然后转移:1.ab交换 ab直接互相转移 dp[i][a][k]=d原创 2015-04-19 21:17:46 · 700 阅读 · 0 评论 -
FZU 2200 cleaning dp+预处理
做法:dp 一维,第几个人,第二维是已经选了几个人,第三维是当前的状态,0 表示当前这位没选,前一位也没选,1表示当前这位没选,前一位选了,2,3类似。枚举开头两个人的状态,然后预处理dp ,当处理到 i+2 的时候,如果状态和开始枚举的一样,就把值加进real[i]中。预处理出来的real就是最后的答案原创 2015-10-06 19:13:34 · 677 阅读 · 0 评论