
一般DP
Lynstery
一只蒟蒻
展开
-
[递推] BZOJ1019: [SHOI2008]汉诺塔
题意题解显然由于有优先级存在,操作序列是唯一的。 我们设g[i][x]g[i][x] 表示一开始有i个盘在x柱,经过一系列操作,他们都到了哪个柱子上。这是唯一确定的。我们再设这个过程的操作方案数为f[i][x]f[i][x]。 这样f[n][0]f[n][0] 就是答案了。(我们用0,1,2表示柱A,B,C) 如何递推呢?联系经典的汉诺塔递推,i是由i-1得来的,我们同样用这样的思路来分析。原创 2017-04-29 11:59:32 · 734 阅读 · 0 评论 -
[DP] BZOJ1079: [SCOI2008]着色方案
题意戳这里题解首先很容易想到,一开始可以把剩余使用次数相同的颜色归到一类考虑。 进一步思考,就可以根据这个想法来设计 DPDP 状态。 我们需要记一下现在剩余使用次数为1~5的颜色各有几种。转移的时候乘一个系数即可。 有关相邻颜色不同的限制,我们可以记一个上次涂的那种颜色现在的剩余使用次数,转移到那种次数的类时把系数减1即可。 很完美的合并了状态,使复杂度可以接受。 用记忆化dfs可以省去原创 2017-08-12 21:51:05 · 387 阅读 · 0 评论 -
[DP] BZOJ1025: [SCOI2009]游戏
题意windy学会了一种游戏。对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应。最开始windy把数字按 顺序1,2,3,……,N写一排在纸上。然后再在这一排下面写上它们对应的数字。然后又在新的一排下面写上它们 对应的数字。如此反复,直到序列再次变为1,2,3,……,N。 如: 1 2 3 4 5 6 对应的关系为 1->2 2->3 3->1 4->5 5->4 6->6 w原创 2017-07-11 09:07:41 · 382 阅读 · 0 评论 -
[DP] BZOJ1831: [AHOI2008]逆序对
题意给出一个n个数的数列,每个数都是-1或是一个在1~K之间的数。-1表示这个位置可以填任意的数字。 求最少能有多少个逆序对。 (n<=10000 K<=100)题解bzoj双倍经验题 1831=1786 首先需要得到一个显然的结论,对于一个数列,如果我们交换一对逆序的元素,总逆序对数一点小于之前的总数。所以我们填的-1一定是不降的。 所以-1之间不会产生任何代价。 先O(n∗k∗log2原创 2017-04-25 09:42:08 · 510 阅读 · 0 评论 -
[DP] BZOJ4300: 绝世好题
题意给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足b(i) and b(i-1)!=0 (2<=i<=len)。题解绝世傻逼题。只是来水一发blog 设f[i]表示以i为结尾的最长长度,推的时候对于2进制每位,记一下在这位上有1的所有a[i]对应的f[i]的最大值即可。 复杂度O(n∗log2a[i])O(n*\log_2 a[i])#include<cstdio>#inclu原创 2017-05-05 16:22:26 · 467 阅读 · 0 评论 -
[AC自动机 + DP] BZOJ1030: [JSOI2007]文本生成器
题意给出n个单词。若一个字符串至少包含一个单词,就称这个字符串是”可读的”。 求长度为m的”可读的”字符串个数。所有字符都在[A,Z]范围。 n,m<=100题解首先一步转化,我们从补集考虑统计ans表示一个单词都不包含的串数,则答案为m26−ansm^{26}-ans。 多串匹配问题肯定要想到AC自动机。 我们要求的是长度为m的字符串没有匹配任何串的方案数。 长度对应AC自动机上走的次数原创 2017-05-01 20:10:40 · 498 阅读 · 0 评论 -
[置换群+背包] BZOJ1004: [HNOI2008]Cards
题意小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红,蓝,绿。 小春发明了M种不同的洗牌法,问Sun有多少种不同的染色方案。 两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种。 输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代 替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。 答案可能很原创 2017-04-09 19:43:02 · 459 阅读 · 0 评论 -
[DP+容斥] BZOJ1042: [HAOI2008]硬币购物
题意有4种硬币。面值分别为c1, c2, c3, c4。 Q组询问,每次给出4种硬币的使用个数上限di,以及一个数S,求组合出S的总面值的满足限制条件的方案数。 di,S<=100000, Q<=1000题解注意到硬币个数对于所有询问时固定的且个数很少,我们肯定需要预处理一些东西。 先不考虑硬币个数的限制,刷一次普通的背包得到f[i],表示用4种硬币组合出i的总面值的方案数。 显然对于每次询原创 2017-02-28 08:37:03 · 438 阅读 · 0 评论 -
[DP] BZOJ1055: [HAOI2008]玩具取名
题意戳这里题解傻逼区间 DPDP 反着考虑,就变成每次合并两个相邻字符变成一个新字符。 f[i][j][0..3]f[i][j][0..3] 表示 [i,j][i,j] 到是否可以合并成某字符。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=305;struct原创 2017-08-14 21:04:20 · 396 阅读 · 0 评论