
动态规划—普通dp
文章平均质量分 70
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
codefores 392B Tower of Hanoi (记忆搜索)
题意:和往常Hanoi问题不一样,这题给出每种操作的花费,用一个矩阵表示cost[i][j],表示从i号移动到j号的花费。问如何移动使得1中的全部圆块移动到3花费最小。题解:很明显要用记忆优化,那么正常的Hanoi问题移动的递归是这样的 dfs(l,n-1,x),move(l,r),dfs(x,n-1,r)但是这题要求得最小花费决策肯定不止这一个,其实还可以这样 dfs(l,n-原创 2015-02-15 14:05:37 · 480 阅读 · 0 评论 -
codeforce 44E Anfisa the Monkey (记忆搜索)
题意:给出一个串,要求分成k份,每份的长度在[a,b]之间 求可行的一个方案。题解:搜索题,直接搜索超时,用dp存下走过的情况。dp[i][j]表示前i个点,分成了j个集合是否走过。#include#include#include#include#include#include#includeusing namespace std;typedef long原创 2015-02-11 17:09:41 · 717 阅读 · 0 评论 -
codeforces 268D Wall Bars (dp)
题意:给出一个n层的楼,每层有四个方向,可以建一个bar,两个层之间的bar要小于h才能可达。求满足至少能达到n-h+1~n方案数!题解:莫名其妙的题目,dp[i][j]前i个高度这个高度建的方向为j的方案书,j=0表示没建。奇葩的题目,这样的状态方程是错的。正解更吓人 dp[i][a][b][c][d]表示i高度a方向是否可达(a=0、1),并且距b方向的bar的距离为b,距原创 2015-02-16 15:27:53 · 826 阅读 · 0 评论 -
codefroces 425E Sereja and Sets (dp)
题意:给出一个数n表示区间的长度,集合S,表示n的子区间的集合。f(S)表示S集合最多可以选择多少个不相交的区间。现在给出n,f(S)=k,求出这样的集合数。题解:这题其实很难,定义这样的状态dp[i][j]前j个点分成i个区间能得到的方案数,用到排列组合,对于这样的状态dp[i-1][k] k到j之间的区间进行排列组合,分割,[k+1,k+1],[k+1,k+2]...[k+1,j]原创 2015-02-16 11:23:25 · 557 阅读 · 0 评论 -
codeforces 14E Camels (计数类dp)
题意:给出n,t,分别表示有n个数,t个波峰,t-1波谷。要求出满足n个数组成类似于波一样的结构,并且波峰t个,波谷t-1个,的种类数。题解:要什么状态就加什么状态呗,我们要确定递推关系,坑定要知道前一个状态是波分还是波谷,才能增加数字使这个状态称为波分或者波谷。要去定上个数是波分还是波谷,只要知道前两个数选的是什么,然后枚举这个数这样就可以构造波峰和波谷。dp[i][j][k][x]原创 2015-02-11 11:52:21 · 665 阅读 · 0 评论 -
codeforces 19B Checkout Assistant (背包)
水题#include#include#include#include#include#include#includeusing namespace std;typedef long long lld;const int oo=0x3f3f3f3f;const lld OO=1LL<<61;const int MOD=1000000007;#define maxn 200原创 2015-02-09 16:16:39 · 721 阅读 · 0 评论 -
codeforces 201C Fragile Bridges
wa代码#include#include#include#include#include#include#includeusing namespace std;typedef long long lld;const int oo=0x3f3f3f3f;const lld OO=1LL<<61;const int MOD=1000000007;#define eps 1e原创 2015-02-10 10:31:36 · 783 阅读 · 0 评论 -
codeforces 67C Sequence of Balls (dp)
题意:给出两个串,有四个操作,每个操作都有一个操作时间,删除、添加、替换、把相邻的交换。问A变到B最少的时间。题解:dp[i][j]表示A处理到了i,B处理到了j的最少时间。首先如果不考虑第四个操作那么状态方程很容易:dp[i][j] = max{ dp[i][j-1]+t1 , dp[i-1][j]+t2 , dp[i-1][j-1]+t3 }但是第四个操作比较复杂,其实原创 2015-02-15 23:41:44 · 641 阅读 · 0 评论 -
codeforces 18E Flag 2 (dp)
题意:给出一个字符串的矩阵,现在要求按这样的规律变换:1、每行只能有两中字母。(每列可以多个字母)2、任意相邻的字母不能相同。求最少的操作数,并且要把变换后的矩阵打印下来。题解:分析下这些要求,会发现一行中必须要是这样的形式才能满足条件:ABABAB....。那么我们定义状态dp[i][A][B]表示第i行用了字母A,B这两个字母构成形式ABABA...(有先后顺序的)原创 2015-02-11 22:23:33 · 739 阅读 · 0 评论 -
codeforces 163A Substring and Subsequence (dp,最长公共子串变形)
题意:给出两个串,问a的连续子串和b的子串(可以不连续)相同的个数。题解:dp[i][j]前i个a的字母和前j个b的字母相同子串个数。#include#include#include#include#include#include#includeusing namespace std;typedef long long lld;const int oo=0原创 2015-02-05 11:32:17 · 739 阅读 · 0 评论 -
codeforces 360B Levko and Array (dp神题)
题意:给出一个序列定义c=max(a[i+1]-a[i]) 11 n题解:这题要逆向思维,实际上我们并不可能枚举要换掉那些数,因此我们枚举c,然后判断c是否可能从数列变来。显然二分能节省很多时间。判断c是否可行,用dp做,dp[i]表示i不改变的最小改变次数,那么状态方程就是:dp[i]=min{dp[j]+i-j-1} i-j-1表示i-j的开区间的所有数都进行改变,想想如果要原创 2015-02-08 11:41:28 · 1392 阅读 · 1 评论 -
codeforces 82D Two out of Three (记忆爆搜)
题意:给出一个队伍,每个人都有一个处理时间,每次可以选择队伍前三个人中的两个人进行处理,处理的时间等于这两个人时间的最大值。问你处理时间的最小值。题解:这种题目有点像是排列组合,每种子情况也对应着不同的子情况,用搜索做肯定能行但是会超时,所以用dp记忆下,记忆爆搜。dp[i][j]表示以i,j两人为头的队列的最小时间。#include#include#include#in原创 2015-02-09 13:04:04 · 828 阅读 · 0 评论 -
codefores 73C LionAge II (dp)
题意:给出一个字符串,然后给出一个k表示能改变的字符串的个数,然后给出n对的字母,这些成对的字符如果出现在字符串中就能够加上对应的价值。问如何改变字符串使得价值最大。题解:有什么状态就加什么,dp[i][j][k]前i个字母,以j为结尾,改变k次,能得到的最大值。转移方成分两种递推。这道题很奇葩,经过检验发现最大的价值可以为负数,真心坑啊,如果原串刚好有一对字母是在给定n对字母原创 2015-02-09 21:49:23 · 502 阅读 · 0 评论 -
codeforces 148E Porcelain (dp)
题意:有一个公主一生气就喜欢摔东西。现在有很多个柜子,每个柜子里面装着很多物品,公主每次摔东西只能随机的选择一个柜子,拿出最左边或者最右边的一个物品摔碎,给出公主最多生气的次数,求生完气之后,公主摔掉物品的价值的最大总和。题解:开始这样想dp[i][j]表示前i个点选j个物品的最大价值,然后枚举左右各取多少个,草稿上写了下,四重循环肯定华丽的TL。其实可以先预处理出第i行去几个物品的最原创 2015-02-06 22:36:12 · 554 阅读 · 0 评论 -
codeforces 413D 2048 (dp)
题意:这是个2048游戏的简化版,只有一行,如果有两个位置的值相等那么就相加,知道不能加为止,题目给出n个数只有三种情况0、2、4, 0表示可以是2也可以是4。问给出的n个数中满足和大于k的方案数。题解:一眼看过去方程很快出来,看似很简单但是很难。因为有这样数据8422,2242222,这样的话中间有组个不能相加,那么要处理后面如果后面的加起来等于前面的于是又可以相加。看到这种数据的确原创 2015-02-15 15:54:47 · 1059 阅读 · 0 评论 -
codeforces 41D Pawn (简单dp+路径打印)
题意:给出一个矩阵,现在可以选择最底下一行的某一列作为开始点,直到到达最上面的行位置。每个字有一个值。要求求出最大的分数值并且这个分数值要能整数k这个整数。题解:和以往的水题dp不同这题限制了要整出k,其实需要什么状态就取什么状态呗。dp[i][j][k]表示i行j列余数为k的最大分数值。那么就很容可以求出解了。计算时,多加枚举左右点的余数值。#include#inclu原创 2015-02-10 23:32:53 · 888 阅读 · 0 评论 -
codeforces 54C First Digit Law (数位dp+概率dp+背包模型)
题意:给出n个区间,然后每个区间中取任何数的概率都是1/(r-l+1),现在问n个区间任意的组成的任意集合,求某个集合满足里面的数首位是1的个数大于k的概率。题解:说起来很绕,读了一个小时也没读懂啊!不看题解的翻译根本读不懂题目啊!我严重怀疑出题人的英语水平。不过是一道好题,首先要得到区间中首位为1的数字个数要数位dp或者组合数学,然后就是背包模型的概率dp,因为要求任意字集合满足原创 2015-02-11 14:34:43 · 931 阅读 · 0 评论 -
codeforces 383D Antimatter (dp)
题意:给出一个数字串,问任取子串,见子串的每个数字之前加上‘+’或者‘-’使得这个子串的和为0,那么这样的子串个数有多少。题解:明显是dp,数据量也不是很大,题目所给了总数的和不会超过10000这其实就是一个状态,dp是统计一类问题的足有解,然后找出我们想要的问题解,那么这题就是统计前i数字和为num的种类数,计算完后只要得到和为0的个数就好。那么状态方程很容易了dp[i][j]表示到原创 2015-02-08 22:28:43 · 847 阅读 · 0 评论 -
codeforces 283C Coin Troubles (神级思维+判环+背包)
题意:给出一些硬币的价值,然后给出一个人拥有的硬币价值,问能有多少种方法得到这种价值,但是还有p个限定条件,就是bi的价值要大于ci的价值。题解:神级的处理方法,如果要是限制条件满足,那么取m个ci肯定要去至少m个bi,那么我们把ci的价值加上bi的价值(假设bi-A,ci-B),那么现在ci的价值就是A+B,总价值要减去ai的价值即-A。然后就可以愉快的完全背包。#include原创 2015-02-09 00:27:16 · 817 阅读 · 0 评论 -
codeforces 176B Word Cut (计数dp)
题意:给出一个串,可以从任意地方截取,然后把两部分位置换下得到新的串,问从a串变到b串有多少种方法。题解:首先我们分析这种变换产生的结果,发现无论怎么变换一个串只能变成和自己不同的len-1个串,而且之后的变化不会出现新的串。这个结论是关键。然后我们分析下,有原串可以变成len-1个非原串,每个非原串又可以变成1个原串,和len-2个非原串。那么我们方向来分析下,一个原串是可以由l原创 2015-02-10 11:55:09 · 1010 阅读 · 0 评论 -
codeforces 119C Education Reform (dp+路径打印)
题意:一个学校要排出n天的课程表,有m个课程,每天有且只能一个课程,给出每个课程需要做的作业量的范围(a[i]——b[i]),和难度。要求n天的课程要按难度递增,并且相邻两天的作业量要满足x[i]=x[i-1]+k或者x[i]=x[i-1]*k。问如何排课程表使得总作业量最大。题解:dp[i][j][k]表示到第i天位置,第i天选了j课程,作业量为j+a[i],因为a[i]可以达到10原创 2015-02-10 18:06:38 · 816 阅读 · 0 评论 -
最长递增子序列nlogn算法的一些脑补
nlogn算法是对n^2算法的改进,看到其中有logn很容想到肯定用到了二分。我们定义个dp 那么dp[i]就表示长度为i的子序列最后一个数的最小值。很显然这个数组是单调递增的因此正为了之后的查找提供了方便,在n^2的算法中我们枚举每个结尾的值然后跟之前的值比较然后跟新最长子序列的dp值,现在nlogn算法也是枚举结尾数,但是在与之前的比较时就不需要用n的复杂度,刚才的dp[i]就派上用处了,因为原创 2014-11-28 23:15:59 · 719 阅读 · 0 评论 -
hihoCoder 1159 扑克牌 (dp,难)
题意:一副不含王的扑克牌由52张牌组成,由红桃、黑桃、梅花、方块4组牌组成,每组13张不同的面值。现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数。牌的表示方法为XY,其中X为面值,为2、3、4、5、6、7、8、9、T、J、Q、K、A中的一个。Y为花色,为S、H、D、C中的一个。如2S、2H、TD等。题解:对应每个排有4中类型dp[a][b原创 2015-05-15 00:02:50 · 1241 阅读 · 3 评论 -
acdream 1086 晴天小猪爱61 (贪心+背包)
题意:给出一个数字,要把这个数字分成尽量少的含有61的数。题解:首先对于n>=6161的数,可以得出一个结论,肯定能分成***61 61**这样的形式。那么对于小于6161的数可以考虑用完全背包,中途记录状态就好了。#include#include#include#include#include#include#include#include#include#d原创 2015-05-08 08:59:38 · 631 阅读 · 0 评论 -
hdu 4901 The Romantic Hero (dp)
这题很好,好到一不小心就超时,要是比赛的时候超时了会慌掉的。不多说状态方程:dp[i][j][2] 表示0-i异或结果为j的个数,0没取到去a[i] 1取到a[i] . rdp[i][j][2] 从i-n与的结果为j的个数同理0、1;#include#include#include#include#include#include#include#include#inc原创 2014-12-04 21:01:50 · 530 阅读 · 0 评论 -
poj 1505 Copying Books (dp+路径打印)
这样的状态变换还是第一次做,题意说:给你一个n长的递增的序列,要求分成k个序列,保证分成的序列最大的那部分和要最小。状态方程:dp[i][j] 表示前j个元素分成i组对应序列最大部分的和最小。dp[i][j] = min(dp[i][j], max(dp[i - 1][k], sum[j] - sum[k]));分割的答应从后往前找,找到小于最有解的就停下记录,记录点作为输出'原创 2014-12-04 16:45:35 · 479 阅读 · 0 评论 -
poj 3661 Running (dp)
题意:给你一个n,m,n表示有n分钟,每i分钟对应的是第i分钟能跑的距离,m代表最大疲劳度,每跑一分钟疲劳度+1,当疲劳度==m,必须休息,在任意时刻都可以选择休息,如果选择休息,那么必须休息到疲劳度为0,当然,当疲劳度为0的时候也是可以继续选择休息的,求在n分钟后疲劳度为0所跑的最大距离。题解:状态:dp[i][j] 第i分钟疲劳度为j的时候走的最大距离注意:分情况讨论。原创 2014-12-10 15:23:43 · 731 阅读 · 0 评论 -
hdu 2577 How to Type (dp)
定义两个状态 dp_a dp_b 分别表示灯是亮的和灯是暗的#include#include#include#include#includeusing namespace std;#define oo 0x3f3f3f3f#define maxn 102int dp_a[maxn], dp_b[maxn];char a[maxn];int main(){ i原创 2014-11-26 19:49:15 · 592 阅读 · 0 评论 -
hdu 1080 Human Gene Functions (编辑距离问题)
这题可以说是最长公共子序列的变形,后面+1变为+scores(对应匹配的分数)注意初始化,各个字母对'-'匹配;#include#include#include#include#include#includeusing namespace std;typedef long long lld;#define oo 0x3f3f3f3f#define maxn 1005原创 2014-11-26 20:12:36 · 580 阅读 · 0 评论 -
hdu 4908 BestCoder Sequence (思维题)
这题非常的考验思维,开始的时候想到用左边原创 2014-11-17 10:44:51 · 668 阅读 · 0 评论 -
hdu1300(水题也是dp)
这题dp的很巧妙,反正这个题目题意我是没弄清楚,讲的不好。状态方程 dp[i] = max { dp[j-1] + (sum[i] - sum[j-1])*p[i] } (选择某段进行替换)#include#include#include#include#include#include#include#includeusing namespace std;typedef原创 2014-11-27 19:18:33 · 736 阅读 · 0 评论 -
codeforces 213C Relay Race(dp)
题意:两个人一个人从左上角一个人从右上角,分别朝着对方的起点走。有n*n的格子,每个格子有一个分数,问两人路径通过的分数和,如果两个人同走了一格那么分数只能加一次。题解:一开始想这样做dp[i][j][k][l]表示第一个人在i,j第二个人在k,l能得到的最大值。但是内存明显不够,然后用滚动数组,但是还是各种wa。大神这样做dp[i][j][k]表示两个人都走了i步,第一个人在原创 2015-02-07 21:35:37 · 832 阅读 · 0 评论 -
codeforces 264C Choosing Balls (dp)
这题各种TL,各种wa,且看大犇解析非常牛逼的将O(n^2)降到O(n)#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int oo=0x3f3f3f3f;const ll OO=1LL<<61;const in原创 2015-02-07 12:19:39 · 647 阅读 · 0 评论 -
codeforces 234F Fence (dp)
题意:给出n个栅栏,需要涂上红色和绿色。红色的面积不能超过啊a,绿色的面积不能超过b。给出每个栅栏的高度,宽度都是1。所得的价值等于相邻栅栏不同颜色的面积。求最小的价值。题解:dp[i][2][j]前i个栅栏,第i个栅栏涂成红色,用去j面积的红色栅栏,所得的最小价值。这题无线TL,就因为输入的时候就超时了,要用文件流读入才能过,坑了2个小时。。。。。#include#incl原创 2015-02-05 22:52:13 · 561 阅读 · 0 评论 -
codeforces 158E Phone Talks (dp)
题意:麦克是个名人每天都要接n电话,每通电话给出打来的时间和持续时间,麦克可以选择接或不接,但是只能不接k通电话。如果某通电话打来时麦克正在打电话他可以选择让电话排队,或者忽略不接。当麦克空闲时首先从排队的第一个打来的电话开始接起。麦克是个很懒的人,所以需要大量的睡觉,但是睡觉的时间必须是连续的,因此要求出麦克能睡觉的最大连续时间。题解:一开状态想错了,想成了dp[i][j][2]前i原创 2015-02-05 10:02:57 · 551 阅读 · 0 评论 -
codeforces 132C Logo Turtle (记忆优化)
题意:一个机器人听指令行动,F表示前进一步,T表示转向。给出一串命令字符,你要k次变换字符,使得机器人走的最远。每个字符可以执行多个命令,命令就是将F变为T,T变为F。题解:开始时想到用贪心,但是这个测试例子推翻了FTTF连续多次出现T。后来想应该就是dp,状态方程dp[i][j][k][2]所有状态都在,前i个点用了j个命令且第i次命令用了k次方向为0或1的最大距离。这样超级难写原创 2015-02-05 20:50:30 · 635 阅读 · 0 评论 -
hdu 5218 Game (dp)
题意:n个人站成一排,开始指向第一个人,每轮从集合中取一个数x然后然后往后x个人,并且把那个人删掉,最优剩下的人赢,问那些人可能赢。题解:dp[i][j],表示剩下i个人,并且现在指向1位置,对于j位置的人是否赢,这都是相对位置。转移时枚举i,j和集合中选取的数a[k]。#include#include#include#include#include#include#i原创 2015-05-03 21:32:06 · 588 阅读 · 0 评论 -
zoj 3872 Beauty of Array (数学题)
题意:给出一个序列,然后问这个序所有子序列对应数值的和是多少,注意这个和是序列中不同的数的和。题解:这题我们可以这样分析,对于某个数,考虑这个数对总的结果的贡献是多少,于是根据这个方向去思考,加上一些实例的判断,发现可以用递推去求解。#include#include#include#include#include#include#include#include原创 2015-04-28 22:48:33 · 595 阅读 · 0 评论 -
acdream 1072 Kill The Monster (dp)
题意:一个人去杀怪,每个时刻每个位置都有一定数量的怪,一个人可以从地图的任意点出发,在某个时刻这个人可以普通攻击和放技能,普通攻击会把这个位置的怪杀掉,技能比较牛逼了,不经杀死这个位置的怪,而且相邻位置的也会杀死。题解:明显是dp,直接根据需要设置状态就好dp[i][u][j][co],表示时间i在地图上u位置用了j次技能并且此事技能还需co的冷却时间。于是直接根据人在地图上的行走来状原创 2015-05-01 14:57:03 · 551 阅读 · 0 评论 -
hdu 1501 Zipper (记忆优化搜索)
这题想到的方法只能是搜索,但是一般的搜索肯定超时,所以可以把一些已经不能成功的情况记录,碰到的时候直接跳了。记忆优化搜索。#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long lld;#define oo原创 2014-11-27 20:32:43 · 613 阅读 · 0 评论