
DP
文章平均质量分 73
大蒟蒻syk
这个作者很懒,什么都没留下…
展开
-
[BZOJ1010] 玩具装箱toy && 斜率优化
朴素转移好写 但是化简需要技巧 一开始暴力化简感觉比圆锥曲线还难搞可以发现Sum[i]和i本身总是同时出现在式子中 合并为T[i] 把L 变为 L + 1能省去很多化简的繁琐步骤 化简完成后就没什么难度了 #include#include#include#includeusing namespace std;const int powAXN = 50000;typedef lo原创 2014-12-09 23:08:48 · 407 阅读 · 0 评论 -
[BZOJ2216][POI2011]Lightning Conductor && 1D1D
题目描述已知一个长度为n的序列a1,a2,...,an。对于每个1输入第一行n,(1下面每行一个整数,其中第i行是ai。(0输出n行,第i行表示对于i,得到的p样例输入Copy (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)6532424样例输出2原创 2015-03-30 10:37:35 · 431 阅读 · 0 评论 -
[BZOJ1833] [ZJOI2010]count 数字计数 && 数位DP
#include#include#include#include#include#define SF scanf#define PF printfusing namespace std;typedef long long LL;const int MAXN = 12;LL d[MAXN+10][10+10][10+10], pow[MAXN+10];LL A[20], B[2原创 2015-03-03 12:43:24 · 443 阅读 · 0 评论 -
[BZOJ1025][SCOI2009]游戏 && dp
本题可直接转化为lcm种类的数量那么可以把n以内质数找出来 可以发现 x1^a1 + x2^a2 + ... = n因此可以转化为背包模型#include#include#include#include#define SF scanf#define PF printfusing namespace std;typedef long long LL;const int M原创 2015-03-31 08:31:39 · 459 阅读 · 0 评论 -
[BZOJ3437] 小P的牧场 && 斜率优化
如果你搞了前面的斜率优化的题 那么这道题应该不算难 考的时候脑残推错了 说不出话来 BZOJ数据显示也是坑 明明100W 后面加个,0 关键是我开1000W会直接T 坑#includeusing namespace std;typedef long long LL;const int MAXN = 1000000;LL d[MAXN+10], Q[MAXN+10], Cost[MA原创 2014-12-13 20:04:24 · 532 阅读 · 0 评论 -
[BZOJ2281][Sdoi2011]黑白棋 && 博弈+计数
一开始看题目看了好久结果最后才发现相邻棋子颜色不同既然相邻棋子颜色不同 那么就一定能决出胜负 所以白棋左移 黑棋右移毫无意义 所以这个问题就神奇的转化为了NIMK游戏两个相邻棋子之间的空格视为石子 每个人每次可以从d堆石子中拿出石子 那么先手必败当且仅当石子的NIM和中1的个数为d+1的倍数 显然终态为0 那么若有d+1个1 先手一次性不能把该状态直接转移到0而原创 2015-03-31 11:47:57 · 1313 阅读 · 0 评论 -
[ZOJ3791] An Easy Game && 计数DP
d[i][j]表示第i步有j个与目标不同 然后通过组合数转移#include#include#include#include#include#include#include#define SF scanf#define PF printfusing namespace std;typedef long long LL;const int MAXN = 100;struc原创 2015-02-07 15:28:13 · 396 阅读 · 0 评论 -
[POJ3245] Sequence Partitioning && dp单调队列+二分
想搞这道题首先你得去把POJ3017做了 这道题是那道题的升级版 首先我们要寻找必须分在一起的数对 寻找的方法是:对B排序 A从后往前找 如果某个Ai > Bj 则该Ai 一定大于所有Bj (j 那么问题就转换成了 将缩点和的N个点分成若干组 每组最大值的和不超过Limit, 每组和S最大值最小问题 和POJ3017十分类似 POJ3017是将S作为限制给出的 这里却成了问题的原创 2014-12-08 23:26:14 · 490 阅读 · 0 评论 -
[CEOI2004] 锯木场选址
记Sw[i]为1-i的重量和 Sd[i]为1-i的路程和 w[i]为第i棵树重量设j为i的最优决策点则有F[i] = w[1]*(Sd[j] - Sd[1]) + w[2] * (Sd[j] - Sd[2]) + .... + w[j+1] * (Sd[i] - Sd[j+1]) + w[j+2] * (Sd[i] - Sd[j+2) + ...原创 2014-12-09 13:54:46 · 740 阅读 · 0 评论 -
[HDU3480] Division
定义状态 写转移方程 作差得不等式 码代码 不要用double类型的函数搞斜率 我直接T了 而且还可能出现精度问题 这道题被坑的原因是 :忘记预处理一直坑的原因是 网上有一份神犇题解 我确实不懂他的队尾维护 其实一般的维护方法就可以了= = 如果你们想研究就拿去看看吧 http://blog.sina.com.cn/s/blog_6e63f59e0101aeaf.html原创 2014-12-10 23:17:27 · 496 阅读 · 0 评论 -
[BZOJ2111][ZJOI2010]Perm 排列计数 && 数学
通过长时间的盯着看 我们可以看出这个序列的大小于关系类似于一个二叉堆 那么我们可以由此dp统计方案 转移方程 son[i] = son[id[i] = C(son[i]-1, son[i那么剩下的问题就是求组合数了 由于n的阶乘可能是p的倍数 那么我们的线性推逆元就会出现错误 所以我们需要用卢卡斯定理把组合数的n和k 映射到p的模系中 内容如下C(n, k) = C(n/p,原创 2015-03-31 09:40:29 · 487 阅读 · 0 评论 -
[BZOJ1026][SCOI2009]windy数 && 数位DP
不允许前导0的存在 所以先把首位非0的都统计出来 然后在把首位填上非0的数 后面的数就可以自由选择了#include#include#includeusing namespace std;const int MAXN = 15;int d[MAXN+10][MAXN+10], Cur[MAXN+10];inline int abs(int x) { return x < 0 ? -原创 2014-12-21 00:29:58 · 375 阅读 · 0 评论 -
[HDU1693]Eat the Trees && 插头DP
bool x, y 打成int 搞了我好久QAQ#include#include#include#include#include#include#define SF scanf#define PF printfusing namespace std;typedef long long LL;const int MAXN = 12;const int MAXS = 1 <<原创 2015-04-10 23:50:14 · 467 阅读 · 0 评论 -
[BZOJ2806][Ctsc2012]Cheat && 后缀自动机
先把所有作文库连起来建立一个后缀自动机 对于每一个询问 把字符串拿到后缀自动机上去跑 计算出每一个位置能匹配的最大长度然后二分一个L值 用dp来检验设f[i]为前i个字符的最大匹配数 就有f[i] = max(f[j]+i-j | i-val[i] 显然i-L单调增 所以可以维护一个队列 里面存放i-L~i的元素 然后检验队首元素是否满足i-val[i] #include#inc原创 2015-06-06 16:16:23 · 1453 阅读 · 1 评论 -
[POJ3986]Math teacher's homework && 数位DP
首先假设xi足够大 就会有ans = (m1 + 1) * (m2 + 1) * ... *(mi-1 + 1) * (mi+1 + 1) *....因为对于此时xi = x1 ^ x2 ^ x3 ^....^ xn ^ k 它被其余n-1个元素唯一确定 我们可以针对这一点进行DP从高位往低位枚举 记录K的当前位aim 用状态f[i][j] 表示考虑前 i 个元素, 当前位(记作b原创 2015-05-19 20:29:54 · 1227 阅读 · 0 评论 -
[POJ2238]Computer Basketball Game && 概率DP
结合代码注释理解一下吧 感觉写的很详细了- - #include#include#include#include#include#include#include#define SF scanf#define PF printfusing namespace std;typedef long long LL;const int MAXN = 40;double f[MAX原创 2015-05-20 17:14:47 · 971 阅读 · 0 评论 -
[BZOJ1492][NOI2007]货币兑换Cash && CDQ分治+斜率优化
这种分治思想我也是醉了Orz首先对于这道题 我们可以发现 如果某一天你要买进或卖出 那一定是尽可能的买或卖那么我们就可以用一个状态f[i]表示某一天的最大收益那么就有 f[i] = (rate[j] * f[j] * a[i] + f[j] * b[i]) / (rate[i] * a[i] + b[i]那么朴素转移就很容易了 怎样优化呢令 y[j] = f[j] / (r原创 2015-04-09 20:16:48 · 469 阅读 · 0 评论 -
[BZOJ3530] [Sdoi2014]数数 && AC自动机+dp
首先要建立AC自动机 然后模板串可能前面出现0 处理起来可能会有点麻烦 所以我们干脆直接把模板串倒着插入 然后在Trie中进行dp用d[i][j][0] 表示在第i个节点 枚举到第j位 且第j位没有超过N的方案数(d[i][j][1]则为超过了至于为什么要统计超过了的数的个数 是因为我们是从低位开始开始确定这个数的 所以之后的位数如果小于N 那么整体是不会超过N的)#include#原创 2015-03-31 21:27:40 · 1110 阅读 · 0 评论 -
[ural1519]Formula 1 && 插头DP(括号表示法)
只是换了一种方法来表示方法 但是括号表示好像跑得快些 #include#include#include#include#include#define SF scanf#define PF printf#define bit(x) (1<<(x))#define getbit(x, y) (((x) >> mov[y]) & 3)#define BIT(x, y) ((x) <原创 2015-04-15 12:55:48 · 955 阅读 · 0 评论 -
[UVA10572]Black & White && 插头DP
多维护一个数来表示轮廓线上颜色的状态 用这个数的第m+1位来维护左上角的颜色信息最后统计答案的时候要注意 这里要求的是一条路径而不是贿赂 所以允许最后一排存在至多一对独立插头(不同颜色不会同时存在独立插头 否则肯定不连通) 其他的玩意已经打在了代码的注释里面了#include#include#include#include#include#define SF scanf#d原创 2015-04-14 23:54:05 · 1002 阅读 · 0 评论 -
[BZOJ3934][CQOI2015]标识设计 && 记忆化搜索
我们用一个五元组(x, y, res, node, lim) 表示一个状态表示我们枚举到(x, y)时 还剩下res个L没有放 当前放下了的L(并且从j1, j2, j3列延伸下来到第x行并且没有结束纵向延伸) lim 表示当前格子是否需要从左边横向延伸由于最多同时存在三个L 所以node只需要记录三列的状态 可以开进一个int里面 然后由于状态数有限 所以可以提前离散化 然后进行转移原创 2015-04-07 19:28:22 · 1688 阅读 · 0 评论 -
[ural1519]Formula 1 && 插头DP
这里用的是最小整数表示法 具体方法参考cdq论文- - if(U)里面多打了个else引发了一场腥风血雨啊QAQ#include#include#include#include#include#define SF scanf#define PF printf#define bit(x) (1<<(x))#define update dp[cur].push(encode()原创 2015-04-11 17:18:55 · 521 阅读 · 0 评论 -
[POJ3311] Hie with the Pie && 状压DP
TPS问题 唯一不同的是不一定只经过一次 所以用Floyd处理下最短距离 其他就一样了。。。#include#include#include#include#define INF 0x3f3f3f3fusing namespace std;const int MAXN = 12;const int maxs = (1 << MAXN);int Map[MAXN+10][MAXN原创 2014-12-12 21:47:54 · 471 阅读 · 0 评论 -
[POJ1038]Bugs Integrated, Inc. && 状压DP
覆盖模型的状压DP 用3进制数表示i-1 ~ i行的覆盖情况 对于读入的残缺格点进行预处理标记 然后DFS构造转移一下就行#include#include#include#includeusing namespace std;const int P3 = 3 * 3 * 3, P2 = 3 * 3;const int MAXM = 10;const int MAXS = P3 *原创 2014-12-19 23:16:12 · 458 阅读 · 0 评论 -
[HDU2089] 不要62 && 数位DP
第一道数位DP的题 不算特别难 转移也好想 就是最后统计答案的时候注意 从高位往低位枚举的时候 一旦有不合法的值出现立即退出 后面统计的都会不合法#include#include#includeusing namespace std;const int MAXN = 10;int d[MAXN+10][MAXN+10], Cur[MAXN+10], Len;char s1[10],原创 2014-12-19 23:18:42 · 334 阅读 · 0 评论 -
[Gym100016J] Taxi && DP
把距离从小到大排序 d[i][j]表示有前i个男生和前j个女生的最优方案#include #include #include #include #include #include #include#include#define max(a, b) ((a) > (b) ? (a) : (b))#define SF sca原创 2015-02-03 20:32:20 · 680 阅读 · 0 评论 -
[CF486E] LIS of Sequence && DP
计算从左往右的最长上升子序列 L 在计算从右往左的最长下降子序列 R如果L[i] + R[i] - 1 否则统计长度为 i 的子序列位置的个数(满足在最长上升子序列内) 如果有且仅有一个长度为i的位置 那就是每一个子序列都包含其他的就是至少一个#include #include #include #include #include #includ原创 2015-02-01 16:43:14 · 509 阅读 · 0 评论 -
[HDU3401]Trade && 单调队列优化DP
从前W+1天前转移过来原创 2014-12-05 22:02:40 · 449 阅读 · 0 评论 -
[HDU2993] MAX Average Problem && 斜率优化问题
斜率优化入门问题 容易得出 arr = (S[i] - S[j]) / (i - j) 这就是一个斜率式 要让平均数尽量大 那么斜率就必须尽量大 所以要维护一个下凸曲线 这道题有一些非常神的东西 导致我不停的超时 最终总结出两点不得不做的1.scanf必须打格式控制符2.必须有读入优化如果懒得管这么多 你也可以通过直接交C++来解决这个问题 只不过时间略卡#include原创 2014-12-08 23:42:41 · 425 阅读 · 0 评论 -
[UVA1252] Twenty Questions && 状压DP
感觉状压DP都是无比的神啊 好难想啊= = 看了LRJ分析才搞出来的 对于cnt的处理 假设某物体的特征为A 枚举到的状态为s 那么s & A这个已有特征集里面就有一个可行物体A 所以要++开始(A[i][j] - '1') 打成了(A[i] - '1') 也不报个错 长教训了#include#include#include#includeusing name原创 2014-12-12 13:02:16 · 406 阅读 · 0 评论 -
[POJ3254] Corn Fields
炮兵阵地弱化版 没什么好说的= = 做完炮兵阵地这就一水题#include#include#includeconst int MAXN = 10;const int p = 100000000;const int maxs = (1 << MAXN);int Map[MAXN+10], ID[maxs+10], d[MAXN+10][maxs+10], idcnt;int n,原创 2014-12-12 22:49:24 · 375 阅读 · 0 评论 -
[HDU3652]B-number && 数位DP
状态略复杂 d[i, j, k, f]表示i位数 首位为j的数字mod13 == f的数的种类 k == 1 包含 13 k == 0 不包含13计数的时候要注意如果输入的n某两位是13那么后面的所有数都可以加进来#include#include#includeusing namespace std;const int MAXN = 15;const int p = 1原创 2014-12-20 14:34:09 · 365 阅读 · 0 评论 -
[UVALive3675]Sorted bit sequence && 数位DP
我被开区间坑了啊!! 其实闭区间也不错 闭区间是INI_MAX 加个1变成开区间溢出了 坑死个人了= = 主要思路 首先要确定目标有多少个1 就把1的个数为0 1 2 的加起来 什么时候超过k了 就停止 这样就确定了1的个数然后需要在这些数里找到目标 方法是二分 然后就没有然后了负数先忽略最高位的1 然后搞完再把符号弄回来就行了 还有就是边界值为0的时候需要有一原创 2014-12-22 23:26:24 · 390 阅读 · 0 评论 -
[UVALive5058] Counting BST && 计数DP + BST
先构造出BST 然后在上面进行统计即可 统计方法为 左子树方案数 * 右子树方案数 * C(当前位置为根节点总数, 左子树为根节点总数)#include #include #include #include #include #include #include#define SF scanf #define PF printf us原创 2015-02-01 16:46:38 · 416 阅读 · 0 评论 -
[HDU3709]Balanced Number && 数位DP
递推四维状态写的我无比纠结 最后无奈弃坑 搞记忆化搜索了 这道题多的一个是要枚举支点o 然后从高位往低位考虑的时候注意力矩是否为正值#include#include#includeusing namespace std;typedef long long LL;const int MAXN = 18;const int MAXL = 2000;int bit[MAXN+10];原创 2014-12-22 12:48:30 · 347 阅读 · 0 评论 -
[POJ1185] [NOI2001] 炮兵阵地
难难难 居然每行只有几十个合法状态预处理状态 编号就开的下数组了 然后转移方程不难 就这样吧状压DP好难啊= = #include#include#includeusing namespace std;const int MAXN = 100;const int MAXM = 10;const int MAXS = 70;const int maxs = (1 <<原创 2014-12-12 17:18:56 · 346 阅读 · 0 评论 -
[UVA10817] Headmaster's Headache && 状压DP
第一道状压DP题 感觉很难搞所以看了看代码 越看越觉得LRJ牛逼 我开始还想用fgets搞 要是那么搞估计得累死 STL大琺好 好吧 说正题 = = 一开始没读清楚题目以为一个老师只能教一门课 结果居然都可以教 那其实还是挺好说的 好吧 = = 其实不算难#include#include#include#include#include#includeusing namesp原创 2014-12-11 23:48:28 · 427 阅读 · 0 评论 -
[ural1057]Amount of Degrees && 数位DP
转换为B进制中1的个数问题.....注意 如果在某个B进制位上的数字>1 那么后面的每一位都变成1 (即使全部都为1也不会大于X)#include#include#include#includeusing namespace std;const int MAXN = 33;int d[MAXN+10][MAXN+10];int base[MAXN+10];int l, r,原创 2014-12-20 14:37:04 · 354 阅读 · 0 评论 -
[SGU390]Tickets && 数位DP
超级难想的一道题用一棵十叉数来统计 因为是各个数位之和 所以要把之前各个数位的和sum记录下来 因为每个数位(子树)并不一定完整的分成cnt组 最后可能有剩余 所以每一个数位(子树)前面肯能会有多余的空间 用rem记录因为需要每组末的空间是在统计时不断改变的 所以dp时要同时记录组数和最后的空余实现方面 沿用上一个记忆化搜索的思路 传入两个参数unlimit1原创 2014-12-23 13:31:55 · 588 阅读 · 0 评论 -
[CodeForces 55D] Beautiful numbers && 数位DP
凡是大于3维的状态我都莫名的想用记忆化省去一维 写法一样注意要离散化LCM值 不然数组开不下 而且CF还报一个奇怪的错 看了我好久#include#include#include#includeusing namespace std;typedef long long LL;const int MAXL = 2520;const int MAXN = 30;LL d[MAX原创 2014-12-23 22:29:17 · 366 阅读 · 0 评论