动态规划 dp
文章平均质量分 65
NightRaven
cust
展开
-
sgu 104 dp Little Shop of Flowers
这题高中做过一遍,这次又碰上了... 给m个花瓶,现在有n束花,每束花放在不同的花瓶中都会有不同的价值,问如何放置能得到最大的价值,并且要求第i束花放的位置小于第i+1束花的位置。 dp[i][j]=a[i][j]+max(dp[i-1][1----j-1]) 直接dp,记录一下上一束花的位置就可以了。dp[1][j]的值要预处理下,直接赋值成a[1][j]的就可以原创 2013-11-13 15:41:47 · 809 阅读 · 3 评论 -
SGU 132 Another Chocolate Maniac 状压DP
一块N*M的蛋糕,有些位置空着,有些位置放着蜡烛,可以用1*2,2*1的巧克力来覆盖空位,问最少需要多少块巧克力,可是使蛋糕上不存在空着的1*2或2*1的区域..蛋糕的宽度最大只有7,可以状压来做。因为放巧克力时,只有当前层和下一层的状态会有影响,所以可以同滚动数组来存储状态每次扩展的时候,先判断一下当前层和上一层是否存在非法的状态(存在完整的1*2或2*1的区间),然后dfs扩展本层所有可以放置原创 2014-01-20 22:22:21 · 818 阅读 · 0 评论 -
sgu223 Little Kings 状压DP
N*N的棋盘,放k的兵,兵可以攻击相邻八面原创 2014-02-07 21:37:54 · 764 阅读 · 0 评论 -
poj3417 Network LCA+DP
给一棵N个节点的树,添加M条边构成一个新的图。现在可以删除一条新边,删除一条老边,问有多少种删除方式,可以使得删除新老两条边后的图不再联通..这题思路也挺神奇的,果然是脑子太死板了不利于做dp的题么= =.....每增加一条新边,一定可以构成一个环,那么我们统计一下树上每条边分别被多少个环覆盖。如果某条边没有被环覆盖,那么它是一个桥,删除他之后,M条新边任意删一条都符合要求,所以ans+=m,如果原创 2014-02-08 01:43:22 · 683 阅读 · 0 评论 -
codeforces 392B Tower of Hanoi 记忆化搜索
汉诺塔问题的变形,给出每个柱子到另一个柱子移动的花费,求最小花费使得n个盘从最左侧移动到最右侧。 汉诺塔问题的移动方案其实就两种,第一种:n-1个盘子从1通过3移动到2,最下面的从1移动到3,n-1个盘子从2通过1移动到3.第二种:n-1个盘子从1通过2移动到3,最下面的从1移动到2,n-1个盘子从3通过2移动到1,最下面的从2移动到3,n-1个盘子从1通过2移动到3.实际就原创 2014-02-19 15:16:28 · 746 阅读 · 0 评论 -
bzoj1026 [SCOI2009]windy数 数位dp
定义windy数是没有前导零且相邻两位数字只差大于等于2的数,查询【A,B】之间有多少个windy数..dp的时候要特殊考虑下当前位以上全是0的情况,所以加一维状态,dp[pos][st][pre]表示第pos位,高一位的值是st,高位是否全为0时有多少个符合要求的数。#include #include #include #include #include using names原创 2014-03-07 20:23:15 · 859 阅读 · 0 评论 -
hdu2089 & hdu3555 基础数位DP
统计区间内有多少个符合要求的数,2089要的是不含4和62的数,3555要的是不含49的数..都是基础的数位统计问题,直接贴模板了...话说数位dp居然还有模板,果然是too young....2089#include #include #include #include #include typedef long long ll;using namespace std;in原创 2014-03-07 18:49:43 · 685 阅读 · 0 评论 -
zoj 3640 Help Me Escape 记忆化搜索
山洞有N个出口,每个出口都有一个难度c[i],如果当前的战斗力大于这条路的难度,就可以花t[i]天走出山洞,否则就会在这条路上被困1天,并且战斗力增加c[i],给出初始的战斗力求走出山洞期望的天数。dp[k]记录战斗力为k时走出山洞的概率,求期望时遍历每个山洞,如果k>c[i],那么dp[k]+=t[i]/n;否则dp[k]+=(1+dp[c[i]+k])/n。#include #inc原创 2014-03-21 18:18:00 · 637 阅读 · 0 评论 -
zoj3623 Battle Ships DP
N M表示N种战舰,防御塔生命值=M,接下来N行,每行两个数Ti表示建造一艘这种战舰需要的时间,Li表示这种战舰建造好后,每秒可以对塔造成Li伤害。求最少多少时间可以摧毁防御塔,同一时间只能造一艘战舰,种类任选。dp[i][j]表示第i时间,攻击力为j时,防御塔的生命值,可以得到两个转移方程dp[i][j]=dp[i-1][j]-j; dp[i][j]=dp[i-t[k]][j-a[k]]-(原创 2014-03-26 23:10:39 · 673 阅读 · 0 评论 -
zoj3537 Cake 最优三角剖分(DP)
给一个多边形,若为凸多边形,则可以通过原创 2014-05-09 11:03:49 · 887 阅读 · 0 评论 -
codeforces 425C Sereja and Two Sequences DP
两个长度分别为n,m的序列,序列中的数da原创 2014-04-28 19:59:44 · 1112 阅读 · 0 评论 -
zoj3795 Grouping DP+强连通
N个人M种单向关系,有直接或间接原创 2014-06-02 10:16:55 · 863 阅读 · 0 评论 -
hdu4734 F(x) 数位dp
没写过几个数位dp的题,拿来练练手..dp[i][j]表示在没有高位限制的情况下,第i位原创 2014-09-04 11:24:44 · 746 阅读 · 0 评论 -
TC SRM629 500pt CandyCollection DP
有一类糖果,每个糖果有li原创 2014-08-13 20:27:55 · 681 阅读 · 0 评论 -
codefroces 486C Hack it! 数位dp+二分
定义f(x)是x的各位数字之和(xshijinzhi)原创 2014-09-24 21:10:59 · 855 阅读 · 0 评论 -
hdu5009 Paint Pearls DP
题意大概是给一个序列,每次可以取走连续的一段,花费是原创 2014-09-17 20:21:05 · 593 阅读 · 0 评论 -
zoj 3738 Buy the Pets 状压DP
有n个人,每个人要买一只猫和一只狗做宠物,有的人对某些猫过敏,有些狗和某些猫在一起会打架..现在问若每个人都能买到一只狗和一只猫,并且人猫过敏的组合,猫狗打架的组后都没有出现,一共有多少种可行方案?这题中心点是猫,所以算出人-猫之间有多少种可行方案,在根据每种可行方案猫的状态来确定猫狗的方案数,两个数乘积就是最后的答案。由于N,M,K都很小,所以可以用状压来做。dp1[i][k]表示前i个人,选择原创 2014-01-20 16:03:25 · 992 阅读 · 0 评论 -
zoj 3741 Eternal Reality DP
学园都市内有等级从0-5的能力者,先给定你的等级(0--5),给出n个你的对手Ai,只有你的等级大于等于Ai你才能胜利并且拿到一分,另外你还可以开挂,在第i回合使用外挂,[I,I+X-1]回合里你等等级+1(如果你是LV5,开挂后还是LV5),并且[i+x,i+x+y-1]回合中你的等级为0.问你最多能拿多少分。这题有两个坑,一个是LV5开挂后还是LV5(这个看过魔禁或者超炮的应该很容易注意到吧.原创 2014-01-19 23:08:32 · 858 阅读 · 0 评论 -
ZOJ 3735 Josephina and RPG DP
给出一个C(3,m)*C(3,m)的矩阵ko,ko[i][j]表示第i个组合打败第j个组合的概率,开始的时候我方可以任意选择一种如何,并且在战斗中,每击败对手一个组合,就可以将我方现在的组合变换成对手被击败的那种组合。接下来给出n个对手的组合,问我方怎么选择,可以使的按给定的顺序打败对手所有的组合的概率最大。 用dp【j】【i】表示击败对手第i个组合时,我方的组合是j,对于dp[j]原创 2013-11-24 18:21:46 · 2091 阅读 · 0 评论 -
sgu131 Hardwood floor 状压DP
先贴个连接:http://www.nocow.cn/index.php/Sgu/131 参考了NOCOW的题解...题意是要铺满N*M的区域,现在有1*2和2*2挖掉一个角 (都允许旋转)两种地砖,问共有多少种铺法..每次转移共有六种方案/*## #. ## ## #. .#.. #. #. .# ## ##1 2 3原创 2013-11-26 15:53:03 · 922 阅读 · 0 评论 -
hdu2825 Wireless Password AC自动机+状压DP
告诉你一个密码的长度是n,然后给m个单词,并且告诉你这串密码至少包含k个单词(单词可以重叠),求密码可能的种数对20090717取模。一开始脑残把题读错了-看成要包含所有m个单词...WA到死,发现后一改直接A掉了....dp[l][i][sta]表示当前长度为l,在自动机上的i状态,单词包含的状态是sta,然后四重循环,直接按dp[l+1][tree[i][c]][sta|ok[tree[i][原创 2013-10-05 13:41:01 · 903 阅读 · 0 评论 -
hdu2457 & poj3691 DNA repair AC自动机+DP
乱搞了一下竟然1A了...太感动了....先给n个病毒DNA序列,再给一个长串。问最少修改长串几个字符,可以让它不包含任何一个病毒序列。拿病毒的序列构造AC自动机,之后再自动机上搞DP,用dp[l][i]表示当前长度为l,自动机上的状态为i时,最少的字符修改数.循环A,T,G,C四种方案,在添加该字符之后的状态为安全的前提下,如果当前方案和母串的第l为刚好相同,那么直接用dp[l][i]去更新dp原创 2013-10-05 16:48:10 · 887 阅读 · 0 评论 -
hdu4081 Qin Shi Huang's National Road System MST+树形DP
平面内有n座城市,每座城市有一个人口数,现在可以预先不用任何代价在两个城市之间连一条边,并且把被连的两个城市的人口数之和记为A,在添加了这一条边的基础上,求一颗最小生成树,权值和记为B,求最大的A/B。 n不超过1000,可以先用普利姆求一个最小生成树,然后以每个城市为起点,做一个DFS,遍历的过程中,记录下起点到当前节点的路径上最长的一条边ds,那么遍历到当前城市k时, 起点和k的人口数之和/(原创 2013-10-05 11:30:30 · 919 阅读 · 0 评论 -
hdu4758 Walk Through Squares AC自动机(trie图)DP
提议大致是给n,m,再给两个非空的不相同的只包含R或D字符串s1,s2,问用n个R,m个D可以组成多少种包含s1,s2的字符串。大致思路的话,先根据两个字符串构造trie图,其实就是把失配函数优化掉的ac自动机。之后用dp[i][x][y][k]表示在自动机上状态i,用x个R,y个D,包含s1,s2的状态原创 2013-10-02 10:22:50 · 1076 阅读 · 0 评论 -
sgu 149 Computer Network 树形dp
一棵带边权的树,对每个节点,求离这个节点最远的节点到它的距离... 两边dps,第一遍记录一下每个节点的子树当中最深和次深的深度和该深度来源节点。第二遍从父节点取出一个最长的并且不通过当前节点的最长的深度去更新当前节点的最深次深这两个值和其来源节点,然后该节点记录的最大深度就是这个节点的答案了。 #include #include #include #incl原创 2013-11-28 22:40:20 · 723 阅读 · 0 评论 -
sgu143 树形DP Long Live the Queen
给一棵树每个节点都有一个权值,求一个权值和联通块。 dp[i]记录以i为根的子树最大的权值和是多少,遍历每个分支v的时候,如果dp[v]>0,就加到dp[i]中,否则直接跳过.. #include #include #include #include #include #include #include #include #include using原创 2013-11-28 22:34:21 · 818 阅读 · 0 评论 -
sgu 168 Matrix DP
把给的两个式子转化过来,其实就是每个位置是从他开始向下到底,向右上45度到头,延伸到右下角的一个梯形中的最小值,那么容易得到dp[i][j]=min(a[i][j],dp[i+1][j],dp[i-1][j+1]);注意一下第一行的情况,特殊处理下ok。 #include #include #include #include #include #include原创 2013-11-30 22:19:07 · 725 阅读 · 0 评论 -
sgu 199 Beautiful People dp
在网上看了个思路,按x递增排序,x相同按y递减排序..然后求一个y的最长上升序列就行..这思路太神了,因为y在x相同的组内是递减的,所以找到一个更大的时,x一定更大..由于长度有10W,求上升序列的时候需要维护一个单调栈+二分,上升序列的长度就是栈的最大深度。路径没有特殊的要求,可行的都可以,每个点记录一下上一个的位置,最后递归或者循环一下输出就可以。 #include #i原创 2013-12-02 18:01:44 · 659 阅读 · 0 评论 -
sgu 195 New Year Bonus Grant 树形dp
给一棵树,根节点为1,对于根节点以外的每一个节点,可以点亮该节点或他的一个儿子节点。求最多点亮的节点数*1000,以及一种可行的点亮方案。 记dp[i][0]为i不点时,i的子树中点亮的节点数,dp[i][1]为i点亮时,i的子树中点亮的节点数。初始状态除了1意外所有的dp[i][1]都是1,然后从根节点开始dfs,dp[i][1]=dp[i][1]+sum(dp[v][0],g[原创 2013-12-02 19:22:25 · 722 阅读 · 0 评论 -
codeforces 258B - Little Elephant and Elections 数位DP
给一个数m,在1到m当中先挑一个数出来,再从剩下的数当中挑6个数,要求这六个数保函数字4或7的个数严格小于挑出第一个数包涵的4或7..先递推求出dp[i][j],表示长度为i的数中,包涵j个4,7的数的个数,再从高位开始推,求出1-m当中,包涵k个4,7的分别有多少个(s[k])。思路挺好想,之前只做过一两道数位DP的题,结果递推式推出来各种呵呵....这东西果然是写多了就熟练了...原创 2013-11-09 10:21:03 · 785 阅读 · 0 评论 -
Codeforces 383D. Antimatter
n个数(1..1000),从这串数中选取一个字串,任意添加数前的正负号,若以一种方案加上符号后该字串的和为0,则是一种可行的方案,问对这n个数共有多少种可行的方案(字串大小任意,至少为2(1个数怎么也凑不出0...))。n个数的和不超过10000.一般情况下,题目的条件都是有用的,这道题就是从n个数的和不超过10000入手.dp[i][j]记录以第i个数为终点,此时和为j的方案数.转移方程dp[i原创 2014-01-21 21:37:19 · 916 阅读 · 0 评论 -
sgu160 Magic Multiplying Machine DP
坑爹dp,dp[i][j]表示前i个数是否能凑成乘积j..输出答案的时候根据当前的乘积和最近一次用到的数暴力没举出上一次的乘积...这tm都能过...... #include #include #include #include #include #include #include using namespace std;typedef long long ll;c原创 2014-01-15 01:19:15 · 666 阅读 · 0 评论 -
sgu 153 Playing with matches DP+枚举循环节
n跟火柴,m+1中取法(第一中取法一定是1),两个人依次来取,取最后一根火柴的人输,但看描述的话好像就是裸的dp,i必败的情况下dp[i+step[j]]必胜,O(n*m)可出,但是这题的n是1e9,m#include #include #include #include using namespace std;const int maxn=2100;bool dp[maxn];原创 2014-01-17 01:23:08 · 734 阅读 · 0 评论 -
leetcode 5. Longest Palindromic Substring
给一个字符串求最长公共字串。直接上o(n)的Manacher,方法网上很多讲的都挺详细,需要的自行百度吧class Solution(object): def pre(self,s): lenS = len(s) i = 0 res = [] while i < lenS: res.append('原创 2016-02-26 00:28:43 · 361 阅读 · 0 评论