
动态规划
文章平均质量分 75
kk303
这个作者很懒,什么都没留下…
展开
-
POJ1631 - 谈解最长非降子序列的又一思路...
最长非降子序列是一类经典的DP问题.....最直接的方法就是每次以当前点扫前面不比自己小的点的DP值...找到其中最大的+1赋给自己作为当前点的DP值....从第一个数一直做到最后一个数...时间复杂度是O(n^2)的....一般的情况这种思路都可以应付....但有些地方就是数据原创 2011-09-07 10:35:46 · 1963 阅读 · 0 评论 -
POJ1014 - 多重背包
题意: 有六种价值的矿石..各有N [ i ] 个...问两个人能否分得同样多价值的矿石 将总价值算出来..TotolValue = ( N [ 1 ] * 1 + N [ 2 ] * 2 + N [ 3 ] * 3 + N [ 4 ] * 4 + N [ 5 ]原创 2011-08-13 18:08:30 · 621 阅读 · 0 评论 -
POJ1463 - 树型DP
题意: 已知一棵树...求用最小的点覆盖所有的边 首先就发现这就是二分图的最小点覆盖...用匈牙利算法求出最大匹配数即可得到最少点的数目覆盖所有边...简直是赤果果的模板题...果断开敲...测了不少数据觉得没问题..就submit了..结果...超时...原创 2011-08-13 17:56:35 · 805 阅读 · 0 评论 -
POJ2193 - 简单DP...
题目意思就是说用1-M的数来填N长度的序列(不重复)...要保证每个数字不小于前一个的两倍...问一共能有多少种序列满足条件... a [ k ] [ i ] 代表长度为k时第k位是 i 的序列种数....那么 a [ k ] [ i ] = ∑ a [ k-1 ] [原创 2011-09-12 18:41:48 · 786 阅读 · 0 评论 -
POJ1080 - DP(LCS变种)
这道通过率超过50%的题居然折腾了我一下午...仔细想一下首先就是题意没有理解清楚...开始自己推了一个DP...即: 首先判断s1与s2的长度...如果一样..则直接输出...如果strlen(s2)>strlen(s1)则把s1与s2换一下.. 用原创 2011-08-15 21:21:44 · 1716 阅读 · 0 评论 -
POJ2373...单调队列优化DP...
这道题调了我一天...呃.....开始很多地方没注意....传说中楼教主的男人八题搞定一道... 这道题是一道典型的DP题...但直接做时死超的....所以要用单调队列来优化....关于最基础的单调队列...我前一篇文章已经说了..所以直接分析本题.. 题意是说有原创 2011-08-25 13:57:58 · 1756 阅读 · 0 评论 -
URAL - 1013 DP+高精度+滚动数组
同URAL - 1012 ..范围更大了...时间不是问题..主要是会爆内存...只要用滚动数组来存就可以了..因为每次做递推的时候只要用到 k 、k-1 和 k-2..每次dp[3]记录最新更新的值..昨晚后 dp[1]=dp[2] .. dp[2]=dp[3]..就滚过去了.原创 2011-09-21 22:40:27 · 695 阅读 · 0 评论 -
URAL - 1012 DP+高精度
和1009一个意思...就是范围大了...要用高精度...用JAVA大数应该方便些....这里的turn是调整高精度数组为每一位都只有一位数并且更新长度...Program:#include#includeusing namespace std;struct原创 2011-09-21 22:27:06 · 883 阅读 · 0 评论 -
URAL - 1009 简单DP..新的开始...
昨天把POJ水到300了....狐狸大牛推荐URAL....这一向就到这里做题去...( 瞻仰小媛大牛 )... URAL的DP分类的第一题....水水更健康..这完全是递推了...没啥要比较的..直接更新... 假设现在要求长度为 N 的 K 进制数中符合条件数原创 2011-09-21 21:42:29 · 1080 阅读 · 0 评论 -
POJ3345 - 树型DP....要细心啊....T_T..
这题卡了将近一天....感觉好没状态啊...开始的DP状态转移还搞错了...搞得自己头都大了...中午看了集《全开Girl》..眼泪都要哗哗了....再来敲...居然给过了....好吧... 题目的意思就是有N个城市...我需要M个城市支持..每个城市都有支持所需要的费原创 2011-08-30 15:04:39 · 1466 阅读 · 0 评论 -
Ural - 1018 纠结的树型DP...
开始题意看错了...因为样例那个2正好是剩下的树枝又是剪掉的树枝..而我一下子犯傻..题目看成减去Q个树枝..剩下的最多苹果...自挽... 题意是给一颗树...每个枝条上有一些苹果( 可能是0..)..问减去一些边后剩下Q条边苹果最多是多少.. 典型的树型DP..原创 2011-09-25 11:52:54 · 685 阅读 · 0 评论 -
URAL 1031 很简单的DP..
题意很好理解...令起点的dp[ start ] = 0 .. 其他的dp [ ] 都赋值为一个大数...从起点的下一个点开始更新...分为 L1 , L2 , L3 种情况往前查找更新...最后输出 dp [ end ] 就行了... 有个地方要特别注意!!就是start原创 2011-10-07 11:04:04 · 1051 阅读 · 1 评论 -
URAL 1029 很简单的DP..就是题目难得看懂..
昨天到刚才优快云一直有点抽..发不了日志..长假过后的第一题...这道题主要就是题目难的看懂...我也是后来找了翻译才看懂的... 明白了意思后就很好做了...开始写的是二维的滚动..就是从第一层一直做到顶层..每次先将当前位置下一层的相同位置更新上来..然后左扫更新一遍原创 2011-10-07 10:59:24 · 842 阅读 · 0 评论 -
USACO Section 1.5 Number Triangles - 最最简单最最经典的DP..
DP最最经典的入门题~~~好吧~~我只是在往后面刷而已~~这章开头是介绍的二进制的说~~不知咋地第一道题居然是个毫无关系的DP....Program:/* ID: zzyzzy12 LANG: C++ TASK: numtri*/ #include #include #include #include #include原创 2011-11-14 20:49:12 · 756 阅读 · 0 评论 -
USACO Section 2.2 Subset Sums - 01背包的思想
题目要求是给一个N..让你求把1..N分成两堆~~并且两堆和相等的方案数.. 如果1..N的和sum是奇数显然无论怎么分成两堆两堆都不可能相等..如果1..N的和sum是偶数..那么就可能存在分成两堆sum/2的情况出现... 对1..N做01背包..由于N最大就39..所以背包的空间最大也就是700多~~我是做到800...每次的转移就是s[i]+=s[i-k]..s[k]原创 2011-11-20 21:38:44 · 1063 阅读 · 0 评论 -
NOIP2008 提高组 C - 传纸条
上周的队内练习学弟选了这题来做~~当时纠结了很久也没搞出来...一个纸条传下去很好做~~但是两个纸条我当时就是没想通如何来避免后效性.. 这道题的DP思想关键就是找到能表示出来的唯一状态...用一个三维数组就行了...因为纸条只能沿着斜线方向来传递..那么用dp [ k ] [ i ] [ j ] 表示从(1,1)出发的两个线路除起点没有公共点到达了第k号斜线的i与j能取得的最大值...只原创 2011-11-25 21:25:23 · 3528 阅读 · 0 评论 -
USACO Section 2.3 Money Systems - 矮油.有Trick阿...
差不多是赤果果的多重背包~~将方案数跟着传递~结果我WA了3,4次才过!!!原因是 1. 虽然说N 2.尼玛最后的结果会可能>2^32阿!!!用long long !!Program:/* ID: zzyzzy12 LANG: C++ TASK: money*/ #include #include #include #i原创 2011-11-28 14:37:51 · 1141 阅读 · 0 评论 -
USACO Section 2.3 The Longest Prefix - 一点点DP思想
题目的意思是给出好一些单词...再给一个长串(多行的接成一行)..问由这些单词一个一个接着一个(可重复)最长能组成所给字符串的前缀... 有点01背包的思想...用一个bool数组来记录字符串的某个位置能否被拓展到..并且在更新拓展位置时同样也是以前面已经拓展的点来看后面(枚举所有的单词,看能拓展到后面那哪些点)..因为所给的单词最长也就10..所以总的来看这种方法效率还是可以接受了.原创 2011-11-28 13:55:49 · 1329 阅读 · 0 评论 -
USACO Section 2.3 Cow Pedigrees - DP状态还是很好找的.
这道题一看就是DP...状态的话用dp[n][k]表示n个点k层且符合题目描述的二叉树个数...那么在更新出dp[n][k]值时就枚举下两边的点数和层数情况..每次两边都是种数相乘..最后之和为dp[n][k]的值..这里能取个巧..就是存在大量的左右换一下是同种情况的数..那么可以枚举一边的个数~~再乘2...但这样也要注意在两边同为k-1层时会多计数..所以当两边都为k-1层的情况不能乘2..原创 2011-11-29 13:24:56 · 821 阅读 · 0 评论 -
POJ3926 - 很少人做的单调队列优化DP..
首先日西一下...Van_Persie是我的小号..zzyzzy12是我的大号..囧...上面是按空间排序..下面是按时间排序...时间排第七...空间居然是第一..好吧!!晒得果断! 回到正题..这道题是上个周末在衡阳八中跟他们一起训练做的...当时只过了6个点...回来再POJ上A发现更多问题...题意我就不再说明了..注意的是这里的长度不会影响上下..也就是说整个可原创 2011-11-08 22:23:59 · 2014 阅读 · 1 评论 -
USACO Section 1.3 Barn Repair - 卡了一年的DP...
看DLX看的蛋都粉了....就去USACO切题了..话说我USACO一年多都没动了~~动一动也挺好的...就是因为这道题~~当年就没继续做下去了...囧..一直弱菜~~不过现在看这题着实很简单...我是用的DP...DP[200][50]...每个点扫他的前面一个点和栅栏数..求的每个栅栏数状态下相连与不相连的情况并选择较优的来更新...从第一个更新到最后一个...就得到答案了.../*原创 2011-11-10 20:36:40 · 1017 阅读 · 1 评论 -
USACO Section 3.1 Score Inflation - USACO的机器好强大~~
题目很简单~~赤果果的多重背包~~~但是!!!!复杂度是O(M*N)的..也就是O(10^8)...呃..最大的一组数据0,3s飘过..USACO的机器给力阿~~这都不超~~Program:/* ID: zzyzzy12 LANG: C++ TASK: inflate*/ #include #include#include #include原创 2011-12-02 16:04:49 · 921 阅读 · 0 评论 -
USACO Section 3.1 Stamps - 表示很Eggache!!!看清题目才是根本..
题目很简单...就是多重背包的思想...保证每个空间尽量能凑出并且所需的数字最小... 问题就是!!!这个背包的大小...必须要注意阿~~2000000基本是要严格的...大一点爆空间...小一点错结果...我开始就是犯傻..开空间各种2...后来再看了下题目才过的...Program:/* ID: zzyzzy12 LANG: C++ TASK: stamps*/原创 2011-12-03 23:06:12 · 647 阅读 · 0 评论 -
USACO Section 4.1 Beef McNuggets - 描述真吓人~
坑爹的描述说最大可能到2*10^9....我开始推的时候就推出最大只会到65535...还犹豫了好久~~结果用这个算法就过了~~最大的也就是65535...数据范围真心好吓人阿... 这道题很简单的说...首先看要输出0的情况... 1.没有得不到的数...那显然只有最小的盒子为1才行..特判就行了.. 2.得不到的数是无穷的.恰恰是这个地方原创 2012-01-07 22:20:09 · 1057 阅读 · 0 评论 -
USACO Section 4.3 Buy Low, Buy Lower - DP+大数加法
这题的本体就是经典的最长非降子序列...第一问就是O(n^2)的最长降序列了... 而第二问则有技巧..首先明确的是要得到方案数..那么在dp更新最长长度时方案数要跟着传递更新..如果没有题目中所给的位置不同但序列每个数相等的序列只能算一个序列的条件...那么更新方案数是当dp更新长度时如果能更新得更长,那么就将方案数直接赋值过来..若相等则相加.. 但是题目中又给出了这个条件原创 2012-01-18 12:16:55 · 917 阅读 · 0 评论 -
USACO Section 5.1 Musical Themes - 题目转换以及KMP..
先写了一个N^3的裸搜试了试~~结果还过了12个点~~囧...然后就想起优化...主要思想是要利用前面已经搜索过的..尽量减少重复的判断搜索...根据这些特征自然而然的想到了KMP...但由于题目中是要求两列每位对应差相等而不是说两列完全相等...所以写了一晚上搞得十分蛋疼..还是搞不出来... 再看了下样例..发现题目可以转化!!! 其实差了一个自然数的两列..若写成相邻前后之差的形原创 2012-01-26 04:07:32 · 945 阅读 · 0 评论 -
USACO Section 5.3 Milk Measuring - DFSID+DP...
这道题要是不要写具体方案数就很普通的可重复背包了..对一个bool数组进行DP...从1做到Pnum..每次当k空间的k-P[i]为可得到时..k空间则可得到...每次扫描空间从0到Q.最后当Q为true..这些物品各种可重复的组合说能得到Q... 但要求具体的方案数就eggache了..开始我想用一个当在做重复背包的时候跟着判断并传递...每个空间不为bool...而是一个struct..包原创 2012-01-31 02:21:57 · 1077 阅读 · 0 评论 -
USACO Section 3.3 A Game - DP而已~
这道题算是USACO3.3里最水的一道了~~~1A啊~~思维也很简单~~从长度为1的一直推到长度为n的... 要更新长度为k的(l,r)的两人分数..首先看当前状态时谁来取..这里就和总个数做个差看下奇偶就可以了...具体更新到什么值就看(l+1,r)+data[l]与(l,r-1)+data[r]哪个更优~~ 注意的是在更新时~~当前长度没更新的那个人的分数也要跟着传递~~P原创 2012-01-04 10:32:57 · 835 阅读 · 0 评论 -
USACO Section 5.3 Big Barn - DP...
看到这题就想到了USACO3.3 的 home on the range....但这题的数据量更大...用之前的方法显然效率不能满足了...之前用的是优化BFS...这里用的是DP... 思路也很简单...DP的目的无非是要利用前面的结果来直接推出后面的结果而减少甚至排出重复计算与判断...这里用M [ i ] [ j ] 表示 ( i,j ) 点为正方形右下方的点时能得到的最大正方形原创 2012-02-03 12:26:53 · 864 阅读 · 0 评论 -
USACO Section 5.4 Canada Tour - DP..
这道题其实可以看成从最左边的起点开始找两条路径..这两条路径除了中点和起点没有其他公共点...这不由想到了08年的NOIP中的.. http://blog.youkuaiyun.com/kk303/article/details/7013314 很类似了..所以这题也是用的DP..并且是极其相似的二维DP.. dp [ x ] [ y ] 代表去的时候到了x这个城市..回原创 2012-02-04 11:03:25 · 1479 阅读 · 0 评论 -
USACO Section 3.3 Shopping Offers - 多重背包
看题目所给的数据范围...最多5种物品..每个物品最多拿5个..那么实际上总状态数最多也就6^5=7776种..并且每种状态可以表示成一个5位的6进制数..每种优惠方案也可以表示成一个5位的6进制数...想到了这里题目就简单了..由于优惠方案是可以多次使用的...所以做一次多重背包可以搞定...我为了方便..就把每个状态都转化成了十进制数...这样感觉更加直观和方便.../* ID:原创 2011-12-31 23:35:09 · 816 阅读 · 0 评论 -
USACO Section 3.4 Raucous Rockers - 一道不错的DP
今天第二个1A的...~~~状态红上的说....这道题很典型的DP...而DP关键就是构造唯一的状态...我是用dp[i][j]表示用到了第i个唱片..并且第i个唱片用了j分钟...找到唯一状态..转移啥的就很简单了...我有个处理..就是用dp[i][0]表示用i-1个唱片最多能存下的歌曲数~~~Program:/* ID: zzyzzy12 LANG: C++ TA原创 2012-01-04 22:59:01 · 1215 阅读 · 0 评论 -
POJ 2033 - DP..考虑要完全..
很明显的动态规划...dp[i]的状态等于dp[i-1] 或者 等于 dp[i-1]+dp[i-2] 或者等于 dp[i-2] ... 关键的就是注意号细节... 1 . dp [ i - 1 ] 能转移过来的条件是 s [ i ] 非0... 2. dp [ i - 2 ] 能转移过来的条件是 s[ i -1 ] *10 + s[ i ] 在[ 10 , 26 ]原创 2012-02-15 23:47:32 · 1042 阅读 · 0 评论 -
POJ-1947 简单的树型DP,但要考虑完全
题目的意思是说给出一个N个节点的树,问最少要剪枝多少才能得到点数为P的子树... 我的做法是从叶子节点按Top顺序更新到根节点,用dp[k][i]来表示保留k点并对其子树剪枝,去掉i个点所需的最少剪枝数...那么一路做到根节点,答案应该是dp[head][n-p].. 但是...这样会WA..因为没有注意..题目之说是点数为P的子树..并没说要包括根节点..譬如说样例输入给原创 2012-03-09 10:08:22 · 911 阅读 · 0 评论 -
分组背包神马的...
Problem Descriptionallen有n种苹果,要将它放入容量为v的背包。而allen厌烦吃同一种苹果,所以每种至多只能放一个。给出第i种中第j个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。Input有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n、v同时为0时结束测试,此时不输出。接下来有n个小组。每个小组的第一原创 2012-03-14 11:03:29 · 1147 阅读 · 0 评论 -
POJ-1625 & ZOJ-1540 & Ural-1158 AC自动机+DP+大数..
AC自动机的DP...每个节点是状态..每条边是转移方向..其实这题和 POJ-2778 DNA Sequence 是一回事..只是这题是高精度..并且数据范围没那么大..所以使得直接DP的效率从时间和空间上都远远高于了用矩阵乘法...囧.. 其实准确的说这题所构造的图不是AC自动机而是Trie图...为了DP转移时更加方便..把节点没有的孩子赋值为其fail点的这个孩子...这样原创 2012-04-05 23:01:24 · 2553 阅读 · 0 评论 -
HDOJ-2825 AC自动机DP+位运算..
题目是要求最少出现k种模式串...开始我看成k个了..囧..k种的话可以用2^k-1的整数可以描述出模式串出现的任意情况...也就是将每个模式串出现否看成二进制的1,0...题目中模式串最多10个..所以模式串存在状态最多1023种... 先用AC自动机构造Trie图...这个已经很模板很模板了..值得注意的是在构造时给每个点我称为data的值..代表从0点出发到这个点的串的后缀子串能原创 2012-04-08 20:10:37 · 1291 阅读 · 0 评论 -
HDOJ-2296 AC自动机+DP..一定要细心..
构造Trie树..通过Trie树构造AC自动机..再通过AC自动机构造Trie图... 本题DP的状态为dp[k][p].w 代表当字符串长度为k时..以头节点到p点为后缀的串所能得到的最大权值...同时用dp[k][p].s来存这个k长度的串..状态转移方向为Trie图中有向边的方向..显然k长度的状态只于k-1的状态有关..所以可以用滚动数组来存储dp状态..原创 2012-04-09 18:41:21 · 1025 阅读 · 0 评论 -
HDOJ-3341 好BT的AC自动机...T_T
好不容易空间卡时间过了...T_T..... 题意是给出N( 用所有模式串构造AC自动机... 然后就DP吧...状态为dp[k][p]...代表AC自动机中点k..所构成'A'..'C'..'G'..'T'.个个数情况为p时所能得到的最多模式串...而这个状态表示方法最大的问题就是如和来表示p...最朴素的就是用[40][40][40][4原创 2012-04-13 15:17:45 · 1148 阅读 · 0 评论 -
HDOJ-3427 & ZOJ-3190 Resource Archiver AC自动机压缩状态DP..
先用resources和virus构造出AC自动机.. 本题最暴力的状态是很好想到的...dp[a][b][c]...代表a长度时某串后缀能到AC自动机点b..能得到c些resources..其中c是一个用十进制表示的二进制数..代表题目里最多10个resources的存在情况...可见此种dp..状态最多可为10000*60000*1024...爆空间爆时间..各种爆..爆得体无原创 2012-04-19 23:16:04 · 1607 阅读 · 0 评论