
动规
文章平均质量分 72
cscoder
这个作者很懒,什么都没留下…
展开
-
hdu 2825 Wireless Password
Wireless PasswordAC 自动机+ DP题目意思:给定M个子串,现需要构造一个长度为N的串使得该串中至少包含K个子串,求有多少中构造方法。开始的时候错误的理解题目意思:认为只需要包含k个字串(允许重复)。。。现在状态就很容易写了。dp[i][j][k] 长度为i处于j状态的包含的字串的情况为k的可能串的个数, 方程就可以直接得到了,这里就不写了,参看程序。。原创 2012-11-01 13:55:57 · 565 阅读 · 0 评论 -
POJ 1088滑雪
滑雪题目意思很清楚就是找一条连续下降的最长序列,不需要求出序列。dp求解,以每个点位终点,那么就有四个方向选择,只需要选出小于当前点的高度且长度最长的就可以了。方程这里就不写了,直接看程序。这里用记忆化的方式会更容易一点。#include#include#include#define MAXN 103 int map[MAXN][MAXN] ;int dp[MAXN][MAXN原创 2012-06-10 21:02:09 · 289 阅读 · 0 评论 -
POJ 2593 Max Sequence
Max Sequence这题与前面的2479相同,都是数字子段和的dp问题,直接采用O(n)的算法即可。代码如下:#include#include#define MAXN 100005int num[MAXN] ;int lsum[MAXN] ;int rsum[MAXN] ;int n ;bool work(){ int i ; if(scanf("%d" ,原创 2012-06-10 12:57:24 · 380 阅读 · 0 评论 -
POJ 2479 Maximum sum
Maximum sum题目很简单,dp问题,就是求最大子段和问题。代码如下:#include#include#define MAXN 50005int num[MAXN] ;int lsum[MAXN] ;int rsum[MAXN] ;int n ;void work(){ int i ; scanf("%d" , &n) ; for(i = 1 ; i <=原创 2012-06-10 12:45:16 · 332 阅读 · 0 评论 -
uva 10465 Homer Simpson
Homer Simpson 题目很简单就是完全背包问题,不过需要记录过程中的数量以及对应的价值总和,以最后的价值总和最大为标准,然后求解。程序如下:#include#include#define max(a , b) a > b ? a : b #define MAXN 10010int dp[MAXN] ;int value[MAXN] ;int num[3]原创 2012-05-31 14:52:26 · 412 阅读 · 0 评论 -
ZOJ1074
ZOJ1074题目很明白,就是求解最大的字段和问题。可以由一维的推到而来,对于二维的我们可以转化为一维的来求解,方法是将从第i行到第j行的每一列对应的元素相加,然后在利用一维求解最大字段和的方式,就可以得到第i行到第j行的最大的字段和。利用此思想我们一次枚举可能的i,j值,然后嵌套求解即可。时间复杂度为O(n^3)。代码如下:/*ID: csuchenanPROG: ZOJ1074L原创 2012-05-12 23:52:03 · 389 阅读 · 0 评论 -
hdoj 1520 Anniversary Party
Anniversary Party树形dp,采用左儿子右兄弟的方式来存储,然后采用递归的方式dp。动规方程很简单,类似于01背包的情况。这里就不在写了。具体的见程序。程序如下:/*ID :csuchenanPROG: hdoj 1520 Anniversary partyLANG: C++*/#include#define MAXN 6010struct Node{ i原创 2012-05-27 00:11:15 · 472 阅读 · 0 评论 -
POJ 1014 Dividing
Dividing题目意思很清楚,这里就不再翻译了。初始的时候,我将他当作分组背包(估计是最近做分组背包做的太多了),来解,但一直超时,后来分析了一下时间复杂度为O(v*n),看了一下数据后,发现根本不可能过的去,v最大可有90000,而n最大有20000,这样怎么可能过的去。。。。。。后来看别人的解题报告的时候,发现可以用多重背包。然后我就对比了一下两者的情况。用分组背包的时候是这么考虑的:每原创 2012-08-14 09:20:37 · 473 阅读 · 0 评论 -
POJ1953 World Cup Noise
World Cup Noise这个题目有点类似于自动机DP,就是给定由n位组成的01序列,求不包含连续的1的序列个数。由于长度为n的字符串是有长度为n-1的字符串组成的,所以我们可以这么考虑,长度为n的字符串可以怎样从n-1的转化过来,对于以0或者1结尾的长度为n-1字符串,可以添加一个0得到以0结尾的长度为n的字符串,而不会使得序列的合法性得到破坏,如果我们要获得一个以1结尾的字符串,我们只原创 2012-08-14 10:26:43 · 469 阅读 · 0 评论 -
hdu 4301 Divide Chocolate
Divide ChocolateDP状态:dp[i][j][1]表示前i个分成j部分并且最后一行被分在不同的部分中的个数,dp[i][j][0]表示前i个分成j部分并且最后一行被分在相同的部分中的个数可以先预处理出1000内所有的,然后只需要查询即可。/* author : csuchenan prog : hdu4301 algorit原创 2012-10-19 23:07:06 · 687 阅读 · 0 评论 -
hdu 1423 Greatest Common Increasing Subsequence
Greatest Common Increasing Subsequencehdu 1423 GCIS (n^2)省赛的时候,这个题目看了良久,都没想到O(n^2)的算法。后来苏犇看到GCIS的时候就让看模版,然后在吉大的模版上看到了这个然后我们就顺利的1Y.我又看了一下这个题目,找了好多博客(不是挂了,就是讲的很不清楚)。。然后看到了http://www.tyvj.cn/bb原创 2012-10-14 22:40:58 · 469 阅读 · 0 评论 -
hdu 4008 Parent and son
Parent and son树形DP题目。题目意思很简单,给定一个无根树,然后给定Q个查询x , y 查询以x为该无根树的根节点,然后查询y的最小儿子,以及中最小子孙。思路:首先我们规定树的根为1,然后进行一次dfs,求解出每个节点x的儿子节点中最小的和次小的,子孙节点中最小的,同时求出x的所有子节点保存的最小子孙节点中的次小子孙节点,以及每个节点x的父亲节点。数组含义如下原创 2012-08-27 21:45:00 · 1242 阅读 · 0 评论 -
hdu 4123 Bob’s Race 树形DP + 单调队列
Bob’s Race在昨天的模拟赛中,有一种情况没想明白,就没怎么写了。今天又想了一下,其实和hdu4008很像。然后重新写了一遍就AC了,看来树形DP的题目还得好好写写。说一下思路:分为求每个点出发的最长路和求最长区间两个阶段。关于求最长区间的可以直接采用单调队列,hdu3530便是一个求最长区间的问题。主要说一下求每个点的出发的最长路。求最长路:两个DFS. 第一次DFS,我们原创 2012-09-02 18:25:16 · 1091 阅读 · 0 评论 -
POJ 2778 DNA Sequence
DNA Sequence 自动机的又一题。这个题目和前面的那个题目POJ1625很相似,不过POJ1625的数据范围没有这么大,如果按照那个题目那样递推过来的话,肯定会超时。对于这么大的数据,一般会想到加速计算,多采用二分法,例如:快速幂取模,矩阵快速幂。而这个题目就是用矩阵快速幂来加速计算的。和前面一样我们可以很容易的写出状态转移方程,其实是一样的方程,这里就不再写了。我们把这个原创 2012-08-16 19:48:56 · 469 阅读 · 0 评论 -
Hduoj 2296 Ring
RingAC自动机+DP。方程很容易写出来,但是对于串的处理确实比较麻烦的。首先方程:dp[i][j] = max{ dp[i-1][k] + tag[j] },这里tag[j]表示到达j状态时所有的匹配得到的数目之和。在递推的时候我们需要注意如果一个状态没有被经过(或者说是没有到达),那么是不能用这个状态来递推到下一个状态的。所以在写的时候有长度为i的到长度为i+1的会更容易写。然后原创 2012-08-20 21:53:13 · 450 阅读 · 0 评论 -
POJ 3691 and Hduoj 2457 DNA repair
POJ 3691 DNA repairHduoj 2457 DNA repair AC自动机+DP。先建立AC自动机,再来看DP。和前面类似考虑方程的时候我们可以结合字符串的长度与AC自动机的状态,来写方程。设dp[i][j]是单词长度为i走到j时最少需要修改单词的个数。那么考虑状态的转化,由于要不含致病基因,那么也就是状态不能走到叶节点。考虑状态j是由那些转化而来的原创 2012-08-17 16:53:07 · 561 阅读 · 0 评论 -
POJ 1625 Censored!
Censored! 这个题目写了一天多的时间,开始的时候,虽然对主要的思路清楚了,但是有些细节问题没有想清楚。在解DP的时候,开始写的时候没有对状态转化搞的很清楚,所以中间出现错误然后又调试了很久,这就浪费了很长的时间。以后还是想清楚细节之后再去敲代码,得训练一下写代码的思维,如何思考更有利于写代码,而不仅仅是注重于问题的解法是什么。 说下这个题目我个人的想法:先建立tri原创 2012-08-16 14:57:40 · 775 阅读 · 0 评论 -
uva:348 - Optimal Array Multiplication Sequence
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=284矩阵乘法问题,区间dp。动规方程为:f[i][j] = min{ f[i][k] + f[k+1][j] + p[i] * q[k] * q[j] } (k>=i &&原创 2012-04-22 13:40:22 · 369 阅读 · 0 评论 -
[NOIP2001]数的划分
http://www.rqnoj.cn/Problem_612.html这道题也是关于整数的划分,与以往不同的是,这个题要求必须将整数拆分成k部分,第一种想法可能需要搜索,但是搜索的速度太慢了,当n=200,k=6的时候,速度就慢的不行了。通过优化,可以将效率提高。题目中举的例子提醒我们,每个数可以被使用多次,我们将结果中的数字按照递增的顺序进行排列,再来看这问题,如果忽略需要拆成k个数,这不原创 2012-04-04 09:48:24 · 741 阅读 · 0 评论 -
[NOIP1999]拦截导弹
题目链接:http://www.rqnoj.cn/Problem_217.html第一问为最长不下降子序列,比较好做,主要是第二问,这里我用多个栈来维护,对于每个栈,栈中元素必须满足以不上升的形式加入,那么遇到一个元素,则要么放进已有的栈中,要么新创建一个栈来维护以这个元素开头的不下降子序列。代码如下:#include #include #include #include us原创 2012-04-02 08:56:18 · 472 阅读 · 0 评论 -
uva:10003 - Cutting Sticks
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=944这个题目开始的时候想正向处理,按照给定的点,不断的划分,但是发现状态转移有些小麻烦,就放弃了那种思路,昨天晚上在睡觉之前突然想到,可以逆向处理的,就是将这支树枝先按原创 2012-03-31 08:47:06 · 476 阅读 · 0 评论 -
zoj:1456Minimum Transport Cost
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1456题目大意:有N个城市,两个城市之间要么有一条运输路线,要么没有。现在有一些货物需要从一个城市运往另一个城市。运输费用包含两部分:通过两个城市之间运输线路的费用,以及通过一个城市时的纳税(起点城市和目标城市除外)。要求输出费用最小,并且路径字典需序最小的线路。原创 2012-03-31 09:06:15 · 394 阅读 · 0 评论 -
zoj1163:The Staircases
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1163求给定数的组合方式,有给定的条件知,数n最多只能由1到n-1个数组成,且每个数只能用一次,所以这里,我们可以把它看作是一个01背包问题,背包的容量为n,物品有n-1个,对应的价值即相应的编号。这里是求解解的个数。动规方程:f[ i ][ v ] = max{f[ i原创 2012-03-30 18:56:47 · 650 阅读 · 0 评论 -
uva:674 - Coin Change
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=615题目大意:有五个数,分别为:1 , 5 , 10 , 25 , 50 ,对于任意输入的一个正整数n , n由其中的一个或者多个数组合累加得到,求有多少种方法。例如原创 2012-03-30 12:57:14 · 567 阅读 · 0 评论 -
uva:111 - History Grading
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=47LCS问题:动规方程:dp [i][j] = dp[i-1][j-1] +1 (numx[i] = numy[j]) || max{ dp[i-1] [j] , dp原创 2012-03-28 18:28:35 · 416 阅读 · 0 评论 -
[NOIP1999]邮票面值设计
题目链接:http://www.rqnoj.cn/Problem_112.html题目题意很简单,想法也很简单,直接深搜加枚举,不过鉴于数据,得适当的优化下。在求解当一个数被加入的时候,要找出相应的产生的最大面值,开始的时候一直没思路,后来想到可以用动规来枚举,这样这个题目就OK了。用动规的时候求解对于给定的一个面值如何用最少的票凑出来,这样我们就可以很容易的计算出上限。如果直接枚举的话,状态原创 2012-04-07 00:03:48 · 1812 阅读 · 0 评论 -
NOI2006:金明的预算方案
题目链接:http://www.rqnoj.cn/Status_Show.asp?SID=744089这题纠结了两三天,主要是主件与附件之间的关系,然后选择问题让人纠结。我们可以将主件与对应的附件进行分组,对每个分组,我们有如下几种选择方式,都不选,只选主件,选主件与一个附件,选主件与多个附件,根据题意,每个分组最多有四种情况,这里可以直接枚举,这几种选择是互不相容的,这样就转化为了分组背包问原创 2012-04-06 15:18:57 · 2865 阅读 · 0 评论 -
116 - Unidirectional TSP
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=52题目意思很明确,并且这一题的递归方程很好写,只不过需要注意的是对于字典序的理解。在更新路径的时候要不断的比较字典序,即要从头到尾的比较而不是仅仅比较前驱。代码如下:/*原创 2012-04-17 18:33:38 · 583 阅读 · 0 评论 -
uva:562 - Dividing coins
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=503题目意思很明确,将给定的物品分成两部分,使得这两部分的和的绝对值之差最小。出看题目,想分成每块硬币放入0号和1号盒子,的最小值,但是发现需要有很多的状态需要记录,随重叠,原创 2012-04-22 11:32:37 · 785 阅读 · 0 评论 -
POJ 1745 Divisibility
http://poj.org/problem?id=1745题目意思很简单,很少做这类型的题目,想要搜索,但是空间太大,想用dp,但是没想到dp的方程,然后上网搜了一下别人的解题报告,看了一下数据存储,就恍然大悟。这里由于除数很小,所以每次我们只需不断的取模即可。dp[i][j]表示前i个数通过添加加减号能否得到结果j,如果能则置为1,否则置为0.动规方程:dp[i][j] = dp[i-1]原创 2012-05-03 09:25:08 · 404 阅读 · 0 评论 -
乘积最大
http://www.rqnoj.cn/Problem_311.html区间dp问题。问题的一般形式为对于长度为j的字串插入i个*号,使得对应的结果最大,设用dp[i][j]来保存结果,插入i个*号后,字串被分为j段,问题的解即变为对于前j-k 个字串插入i-1个*对应的结果然后乘以区间(j-k+1 , j)的最大值。动规方程dp[i][j] =max{ dp[i-1][k] * resu原创 2012-05-02 20:26:02 · 460 阅读 · 0 评论 -
过河卒
http://www.rqnoj.cn/Problem_69.html坐标DP问题,本题比较简单,动规方程dp[i][j] = dp[i-1][j] + dp[i][j-1] ,对于特殊的点,只需要判断一下,然后赋值为0即可。虽然数据规模比较小,但是结果却比较大,需要用long long存储,同时输出的时候用%I64d输出,用%lld出错。代码如下:/*ID: csuchenanPRO原创 2012-05-02 19:32:43 · 536 阅读 · 0 评论 -
uva:10131 - Is Bigger Smarter?
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=1072简单dp,是最长上升子序列问题的变种。要注意样例,对于其输出结果,得到得先将输入的序列进行排序,然后再动规。由于要输出对应的序列号,所以这里我们就直接采用O(n^2)算法。原创 2012-04-17 20:43:12 · 430 阅读 · 0 评论