DP
文章平均质量分 69
double1994
这个作者很懒,什么都没留下…
展开
-
HDU 2457 DNA repair
基本照抄cxlove代码。。。AC自动机+DP。原创 2014-04-13 21:43:53 · 470 阅读 · 0 评论 -
hud 3237 Help Bubu
状态压缩。四维。当前到达第几本书、已经选了几本书、之前没选的书所构成的状态、前一本书。一开始没思路。看了下别人的题解。之前一直让我困惑的就是第三维解决的问题,只要记录没选的书的状态即可。最后加上选走且剩下的书中没有的书种类数几位最终复杂度。#include #include #include #include #include #include using namespace st原创 2014-03-07 21:49:20 · 490 阅读 · 0 评论 -
hud 2809 God of War
状态压缩。不堪回首的一题,很水,但是调了一下午。重写了三遍。细节方面需要注意点。题目给的条件多了,脑子就乱了,其实大部分条件都只是干扰项。还是要先分析清楚再写,不然脑子混混沌沌的很容易出错,效率太低。1.一开始开了个二维,一维是状态,一维是灭了几个人了。后来发现不用记录灭了多少人,每个人只能被灭一次,状态直接可以显示出人数。2.当攻击低于防御时会强制扣一点血#include #inc原创 2014-03-08 17:27:21 · 471 阅读 · 0 评论 -
POJ 3254 Corn Fields
状态压缩。略水。细节方面出了点问题。总是出现这样的问题,要注意下了。#include #include #include #include #include #include using namespace std;typedef long long LL;#define INF 1000000000#define N 1000int n, m;int a[105][10原创 2014-03-06 23:04:11 · 475 阅读 · 0 评论 -
POJ 3107 Godfather
给一棵树,去掉一个节点后,剩下块中最大值最小时,此节点为要找的节点。思路很简单,深搜一遍就可以了。关键是存储,要用邻接表。表示之前完全不知道又邻接表这回事。。。图论一点没看- -!憋了N天(N>10)。。。#include#include#include#includeusing namespace std;struct Node{ int v; Node *n原创 2013-10-11 09:50:53 · 594 阅读 · 0 评论 -
POJ 1655 Balancing Act
树形dp,水。 平衡值是去掉当前节点后剩下的树中节点数最大的树的节点数,求最小平衡值。多个答案任意输出一组。把2378的代码稍微改改就行了。。。ps:双向存边时,边数应至少为节点的两倍,否则会RE.#include #include #include #include #include #include using namespace std;typedef long lon原创 2014-03-12 15:28:39 · 443 阅读 · 0 评论 -
hud 1438 钥匙计数之一
纯暴力状态压缩dp,很水。几个for循环莫名其妙的少了一次,调了一个小时。。。。真是db#include #include #include #include #include #include using namespace std;typedef long long LL;#define INF 1000000007#define N 1000LL dp[40][16]原创 2014-03-06 21:03:37 · 596 阅读 · 0 评论 -
POJ 2411 Mondriaan's Dream
状态压缩dp。搜了n多题解。。。都看不懂- -!最后在波神的解释下将discuss里一超短神解理解了。。。不能更神。详细注释下。代码完全是抄的。#include #include #include #include #include #include using namespace std;typedef long long LL;#define INF 1000000007原创 2014-03-05 17:39:22 · 487 阅读 · 0 评论 -
CF 401D Roman and Numbers
状态压缩,第一维记录哪些位置的数字用过,第二维记录当前状态余数为多少。在第三层循环时,若数字x前面已经用过,则不用再次计数,因为没有区别,如果计入则最后需要除以每种数的阶乘。#include #include #include #include #include using namespace std;typedef long long LL;LL dp[1 << 18][103原创 2014-03-11 09:14:24 · 717 阅读 · 0 评论 -
CF 396A On Number of Decompositions into Multipliers
组合数问题。表示现在不会。dp写个。感谢波神教会我优化。。。不然死都过不鸟。。。每种因子在转移时数目是一样的,可以预处理。但是三重循环必然超时,因为是从前一行转移到后一行,每次可以先处理出所有情况,可减少一重循环。关于取余还逗b了下,认为当dp恰好为INF整数倍时取余为0,会导致答案为0,实际上答案就是0。。。#include #include #include #include原创 2014-02-28 21:46:56 · 1244 阅读 · 0 评论 -
POJ 2378 Tree Cutting
树形dp,水。不存在找不到答案的情况。当1.子节点中节点数最大的与2.所有节点减去当前节点加所有子节点和的数目都小于等于n/2时满足条件。ps:邻接表双向存边,访问注意不能回头访问父节点。#include #include #include #include #include #include using namespace std;typedef long long LL;原创 2014-03-12 15:16:44 · 547 阅读 · 0 评论 -
POJ 3140 Contestants Division
树形dp,水。 求将一棵节点有权值的树分成两块,两块总权值差最小值。ps:注意本题要用longlong,第一次应该wa在这里,然后换了种写法,导致tot和mv未初始化,再wa一发。这类题目初始化问题需要格外注意。#include #include #include #include #include #include using namespace std;typedef l原创 2014-03-12 16:22:35 · 511 阅读 · 0 评论 -
SPOJ 2815. Increasing Subsequences
dp,开50棵线段树,每棵存到当前位置连续长为k的序列总数。注意代码中有一需要注意的地方,即当前数为最小数时,前一棵树的总和必然为0,不能通过求p - 1的总和数来求,此时p - 1 为-1会导致出错。另外,没离散化1e5超时,离散化1e4过了,spoj真是卡常数。。。#include #include #include #include #include #include usi原创 2014-03-25 14:42:23 · 806 阅读 · 0 评论 -
HDU 2296 Ring
AC自动机+dp。注意最后极值为0的情况,wa一发。原创 2014-04-20 13:27:29 · 576 阅读 · 2 评论 -
HDU 4734 F(x)
数位dp,写的非常挫。ul为超出部分,fu为缺少部分。当前数位超出或缺少部分大于一定数值可直接返回#include #include #include #include #include #include using namespace std;typedef long long LL;#define lson l, m, rt << 1#define rson m + 1,原创 2014-03-25 21:53:38 · 398 阅读 · 0 评论 -
POJ 1625 Censored!
自动机#include#include#include#include#include#includeusing namespace std;#define N 2005#define INF 1000000009typedef long long LL;int n;int letter[300];struct Trie { Trie *fail; Tr原创 2014-04-19 21:47:17 · 476 阅读 · 0 评论 -
SPOJ 3408 DNA Sequences
求最长公共子序列,且每一连续子段的长度不小于k。用sum数组记录前面有多少连续的序列。sum[i][j] 只能由sum[i - 1][j - 1]转移而来。sum数组的转移与dp数组的转移独立开来。当sum[i][j] > k时,可以选择从前一位连过来,也可以从前k位连过来。[i,j]序列还是表示当前位置的状态好点,若表示[i - 1, j - 1]的状态则最后会略纠结。#include #原创 2014-03-22 14:55:06 · 829 阅读 · 0 评论 -
CF 10D LCIS
最长公共递增子序列。o(n*m)做法。只在cf上过了。。。poj,zoj都wa出翔了。。。记录路径要开二维数组否则会wa。#include #include #include #include #include #include using namespace std;typedef long long LL;#define INF 1000000007#define N 5原创 2014-03-19 20:45:30 · 708 阅读 · 0 评论 -
POJ 1947 Rebuilding Roads
树形dp。dp[i][j],表示以第i个节点为根节点,形成含有j个节点的子树最少去掉的边。最后计算答案时除根节点外,其余节点的答案都要+1,因为与父节点有条边。状态由下一层转移过来时dp[i][j] = min(dp[i][j], dp[tmp][x] + dp[i][j - x] - 1);减1是减掉下层与当前节点连接的边。ps:因为必然有答案,所以转移状态时不需要特判。必须从sum[rt]原创 2014-03-15 10:47:20 · 511 阅读 · 0 评论 -
ZOJ 3375 Imperishable Night
状态压缩。路径的选择和每条路径内宝物的选择是没有必然关联的,分开处理。选择路径时直接状态压缩。在处理路径内部选择时,出现了问题。一开始想复杂了,比如选下a,再选下b,某一个增加以后会对后面产生怎样的影响。。。其实必然是先选完一种再选另一种。一次选择时,选a时,b可以增值x次,共x*va点,选b,则后面x次拿a会增值vb点,共x*vb;所以选择是固定的,只与增加值大小有关。另zoj64位用lld输出原创 2014-03-09 12:46:14 · 563 阅读 · 0 评论 -
POJ 2923 Relocation
状态压缩。一开始思路不怎么清晰,写了个比较挫的代码,数组刚好是10导致递归到11时re,改正后超时。优化了下,把求所有可以转移的状态放到dp循环外面先处理出来。本来不怎么抱希望能过的,结果过了。。。#include #include #include #include #include #include using namespace std;typedef long long原创 2014-03-07 23:04:01 · 466 阅读 · 0 评论 -
CF 258B Little Elephant and Elections
数位dp。 先找出含不同数目幸运数字的数量。然后直接暴力求解。本题是第一次做这种找不同数目特定数字的数位dp,加一个参量。在函数外面加一重循环,指定数目,最后判断是否与预期数目相同即可。暴力求种类数每一个政党可能选的所有数目是相加的,每一种数目的下的种类与后面政党的所有可能数相乘。一开始全部相乘搞错了。波神是dp过的,10^5,优化了两个数量级。感觉没有太大必要提交时db了两次,第一是原创 2014-03-01 20:48:45 · 623 阅读 · 0 评论 -
CF 16E Fish
状态压缩。计算概率时需要注意每次概率应该除以所有可能中选中当前组合的概率。#include #include #include #include #include #include using namespace std;#define LL long long#define INF 1000000007#define N 18int n;double a[20][20]原创 2014-03-01 14:59:37 · 580 阅读 · 0 评论 -
POJ 1050 To the Max
经典DP。求最大子矩阵和。记录每行中任意两点区间和,向下递归时,判断上一行相同区间和是否为正,是则加上。内存为100*100*100,时间也是100*100*100。内存4000K。发现有400K左右的。应该是开100*100*2。边计算边递归。#include#include#include#includeusing namespace std;int a[105][106];原创 2013-09-13 09:55:17 · 529 阅读 · 0 评论 -
POJ 1157 LITTLE SHOP OF FLOWERS
DP。比较简单。需要注意的是必须把全部花都插到花瓶里去,即使最后结果是负值。WA了好几发,问题都围绕在将全部花都插入上。注意的地方在代码中注出。#include#include#include#includeusing namespace std;int a[105][105];int r[105][105];int main(){ int f,v; while原创 2013-09-13 12:01:09 · 634 阅读 · 0 评论 -
POJ 1036 Gangsters
这两天准备看状态压缩DP或树状DP,大概看了点(看了跟没看一样),到题目全傻眼。。。回来水水。。。本题简单DP。唯一需要注意的是某时刻可以进来多个相同体型相同时间到达的人。此处WA了n次。另内存稍稍卡了下。滚动数组直接搞定。#include#include#include#includeusing namespace std;struct G{ int t; i原创 2013-09-11 21:43:27 · 512 阅读 · 0 评论 -
POJ2184Cow Exhibition
一开始准备用二维的背包,且不说空间不够用,二维还开错了....然后瞄了眼题解,发现一维数组可以搞定...200000的数组.因为数据有正有负,一维不好解决,于是开了200000*100,超内存.接着用滚动数组解决了.其实可以分正负,一维搞定.贴上自己代码,和一维代码我的:#include#include#include#include#define max(a,b) (a)>(b)?(原创 2013-07-25 10:45:41 · 466 阅读 · 0 评论 -
HDOJ 2577 How to Type
DP 水题,唯一注意的是数组开成char 了#include#include#include#include#define PINF 0x7FFFFFFF#define NINF -0x7FFFFFFF#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))char a[105];int r[105]原创 2013-07-28 21:06:40 · 510 阅读 · 0 评论 -
UVA 12089 The Luncheon
DP水题,用三维数组记录状态,一维是天数,二维是点到A喜欢菜的天数,三维是点到B喜欢菜的天数,唯一需要注意的是循环时二维加三维的和可能大于天数(一维),不要为了节省时间搞错,华中科大OJ已挂...木有代码。主要状态人r[101][101][101];具体意义如上;f[4];f[0]为都不喜欢。f[1]为A喜欢,f[2]为B喜欢,f[3]为都喜欢。递归时共三个for()最外层是天数原创 2013-08-10 09:56:16 · 626 阅读 · 0 评论 -
HDOJ 3496 Watch The Movie
本题为二维费用背包。#include#include#include#include#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)<(b)?(a):(b)#define PINF 0x7FFFFFFF#define NINF -0x7FFFFFFFint n,m,l;int val[105],cost[105],r[1原创 2013-07-24 16:50:30 · 573 阅读 · 0 评论 -
HDOJBone Collector II
背包第K解问题,四个for,一开始以为超时,但是数据范围小,可以接受。自己的代码1100ms,另贴一份100ms的自己的#include#include#include#include#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)<(b)?(a):(b)#define PINF 0x7FFFFFFF#define NI原创 2013-07-25 16:35:45 · 415 阅读 · 0 评论 -
HDOJ 1025 Constructing Roads In JGShining's Kingdom
本题求最长递增子序列长度,一直只想着记录长度,两个for直接超时,其实应该用一个数组记录各长度子序列最大的元素,并不断更新序列中元素,使之为当前长度最小。#include#include#include#includeint a[500005],r[500005];int cmp(const void *p1,const void *p2){ return *(int *)原创 2013-08-01 10:47:20 · 629 阅读 · 0 评论 -
POJ 1088 滑雪
记忆化搜索。刚开始学DP就做过。不过记忆化搜索不怎么熟,又做了一次。WA了3发,- -!首先记录最长区间长度的数组初始值应该赋值为1。另外一个错是将长度数组错写成高度,如果没写错第一个错也能查出来。#include#include#include#includeusing namespace std;int a[105][106];int r[105][106];int n,原创 2013-09-13 10:21:51 · 527 阅读 · 0 评论 -
POJ 1276 Cash Machine
多重背包,需要优化下。开两个数组,一组记录所有范围内下标值可否达到,另外一组记录下标,同时记录可达下标数目,每次只查询可达下标。另注意问题代码中标出。ps:一开始直接01背包偷懒过了。。。800ms+,多重背包30ms+ - -!#include#include#include#includeusing namespace std;int cash;int n;int a原创 2013-09-13 20:47:16 · 413 阅读 · 0 评论 -
HDU 4722 Good Numbers
数位dp。出现了几个问题。1.函数返回值应该为LL,错一次2.(dp第二维为前面数的和,可以对10取余,减少时间(之前没改超时))。感觉dp数组初始化为-1会快点。因为值为0时也可以直接返回,减少递归次数。实际上差不多,因为值为0的不多。#include #include #include #include #include using namespace std;#defin原创 2014-02-28 02:51:27 · 457 阅读 · 0 评论 -
BZOJ 1026 windy数
简单数位dp。数组为三维,分别记录第几位,前一位数字,和状态。相同位不同数字的结果不一样,一开始只开了两维,结果导致出错。和之前的数位dp不一样,本题是考虑两位之间的关系,而不是固定的考虑某一两位数字。比如1 的下一位可以有7种状态,而9 的下一位有8种。无比dt的调了好久。。。#include #include #include #include #include using na原创 2014-02-28 02:03:10 · 1026 阅读 · 0 评论 -
HDU 3555 Bomb
数位dp,第一发模板题。#include#include#include#includeusing namespace std;#define N 25#define INF 1000000000int len;char a[100];long long dp[100][3];long long dfs(int id, int s, bool f){ if(id >原创 2014-02-27 11:16:54 · 574 阅读 · 0 评论 -
CF 11D A Simple Task
状态压缩。v数组第一位记录环中的点,其最低位第一个点为起始点,第二位为结束的点。第一重循环为所有的点状态,第二重为结束点。第三重为终结点可达的点,若可达起点则记录,可达其他未到达的点则将其v数组状态更新。为保证起始点不变所以从最低点往高处搜。#include#include#include#includeusing namespace std;#define N 20#define原创 2014-02-25 22:32:49 · 1149 阅读 · 0 评论 -
CF 8C Looking for Order
模板题,dp数组下标表示当前状态,拿物品的顺序无所谓,所以从最低位没拿的开始拿,是否顺路拿第二个或者不拿有24种状态。#include#include#include#includeusing namespace std;#define N 25#define INF 1000000000int x0,y0;int n;struct CO { int x; i原创 2014-02-25 22:17:20 · 675 阅读 · 0 评论 -
Ural 1260. Nudnik Photographer
DP,难度标的很低,但是自己没有想出来,表示智伤真的没有下限。。。1是固定的,12开头是r[n-1],1324开头是r[n-3],135...42是单独一种。r[n]=r[n-3]+r[n-1]+1。#include#include#include#includeint n;int main(){ scanf("%d",&n); int sum=0;原创 2013-11-07 16:38:34 · 521 阅读 · 0 评论