dp
菜得不行的sb
摸了
展开
-
Manthan, Codefest 17 C. Helga Hufflepuff's Cup
树dp 三维状态 dp[i][j][k]表示 点i 的数字状态为j k为已经有的特殊颜色的个数变成一个背包#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#in原创 2017-09-25 12:12:41 · 198 阅读 · 0 评论 -
Hari Merdeka UVALive - 6806
用给的模式串build一个ac自动机 然后在fail树上做一个背包dp dp[i][j]表示第i个状态下花费了 j 获得的最大价值(顺便升级了一下原来的ac自动机模版)#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#i原创 2018-04-09 14:08:56 · 127 阅读 · 0 评论 -
SGU 143 Long Live the Queen
求一棵树上的联通子图使得其所有节点权值和最大树形dp dp[u]表示这个结点为根的最大权联通子图 转移为dp[u] = val[u] + sum( max(0,dp[v]) ) 假如选儿子节点的贡献为负则不选#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>原创 2018-03-27 12:59:29 · 183 阅读 · 0 评论 -
Damn Couples ZOJ - 3161
考虑一串相邻的关系 设f[i]为有i个人的时候最多剩下的人 那么转移就为 f[ i ] = max( f[ i ] , min ( f[ i-j ] + f[ j-1 ] , f[ i-j-1 ] + f[ j ])( j< i ) 右边的min表示两个人其中一个人走掉的最坏情况然后把关系分成一段段连续的处理就行了 需要注意给出的序号并不是有序的这是我自己的写法 把连续的一段减少的算出来原创 2018-03-28 13:59:48 · 484 阅读 · 0 评论 -
Painting the balls SGU - 183
定义 dp[i][j] 表示最后一个在位置i 倒数第二个在j时候的代价 这个复杂度是O(n*m*m)的 所以需要优化转移的时候是枚举ijk 三个点 优化实际上就是固定了中间那个点j 移动最后面的点i 往前移动i的同时用f[j][i-m]更新最小值 同时这个最小值也能更新新的f[i][j]优化后的复杂度为O(n*m)#include <iostream>#include <algorit原创 2018-03-28 21:08:06 · 456 阅读 · 0 评论 -
CS Academy Round #74 (Div. 2 only) A B C D E
A找出有多少独角兽因为范围很小 所以枚举即可 int a,l,h; sddd(a,l,h); for(int i=0;i<=a;++i) { int leg = l - i*4; int ho = h - i; if(ho&1)continue; if(ho*2>leg)continue;原创 2018-03-29 16:20:16 · 236 阅读 · 2 评论 -
Lock (fft + 状压dp)
Description Yplusplus has a rotary password lock. The lock has n(n <= 50000) positions and each position corresponds to a number from 0 to 3. This is a rotating lock, so digits of each position ar...原创 2018-04-18 21:12:21 · 290 阅读 · 0 评论 -
CS Academy Round #77 (Div. 2 only) C D
https://csacademy.com/contest/round-77/summary/C 对矩阵从右往左做一个先后手的dp dp[o][i][j]表示o玩家在从左边走到i行j列后可以取到的想要的最优解#include <iostream>#include <algorithm>#include <sstream>#include <...原创 2018-04-19 19:18:04 · 167 阅读 · 0 评论 -
Educational Codeforces Round 49 (Rated for Div. 2) E - Inverse Coloring
题意: 有一个n*n的方格需要染成黑白颜色 定义方格为beautiful的当且仅当每对相邻行的对应格子都相同或都不同,对列同理。 定义方格为suitable的当且仅当不存在大小&gt;=k的同色子矩阵首先考虑单独一行 可以通过dp算出长度为n的序列中最大连续同色长度为i的总方案那么再考虑列 因为方格是n*n的 所以行跟列考虑其实是一样的 选出了一行方案的再选列的方案就能确定涂完...原创 2018-08-23 22:38:16 · 156 阅读 · 0 评论 -
BZOJ 3679: 数字之积
<1e9的乘积的状态并不多 所以直接用map写个dfs的数位dp#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#inclu原创 2018-03-31 15:03:19 · 275 阅读 · 0 评论 -
51nod 1486 大大走格子
容斥把(h,w)看成黑格子 先按偏序对黑格子排序然后对每个黑格子算出到不经过前面每个黑格子的方案数 最后的到(h,w)黑格子的方案数就是答案因为对于每个方案数 都减去了前面不能走的方案 (另外,题目根本没说只能往右往下,还以为是插头什么的)#include <iostream>#include <algorithm>#include <sstream>#include <string>原创 2018-03-31 10:39:44 · 201 阅读 · 0 评论 -
True Liars POJ - 1417
题意: 有p1个好人,p2个坏人 好人只说真话 坏人只说谎话 给出n句某个人说某个人是真人还是坏人 问是否存在好人和坏人方案的唯一解 有的话则升序输出好人先用一个带权并查集维护一个联通块内的关系 然后dp[i][j]表示前i个联通块内有j个好人的方案 因为是唯一解 所以输出方案的时候倒过来推就可以了#include <iostream>#include <algorithm>#i原创 2018-03-30 09:25:29 · 301 阅读 · 0 评论 -
Codeforces Beta Round #8 C. Looking for Order CF8C
就是个记录路径的dp 但是每次枚举走1个点和走2个点会超时可以注意到明显每次尽量拿2个是比只拿1个更优的 考虑一个三角形 两边之和大于第三边因此对每个状态枚举拿2个 固定一个和枚举一个 这样就能枚举到所有情况#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue原创 2017-10-18 13:31:37 · 261 阅读 · 0 评论 -
Codeforces Round #114 (Div. 1) B. Wizards and Huge Prize CF167B
考虑把得到的奖和获取的背包容量两个状态分开来算概率结果再把符合要求的两个状态的概率相乘#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utili原创 2017-10-12 13:57:24 · 292 阅读 · 0 评论 -
Engineer Assignment HDU - 6006
状压dp关键是直接对每个项目预处理完成需要的人选 还有就是位运算一定要加括号#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>原创 2017-10-22 17:14:07 · 256 阅读 · 0 评论 -
Mr. Panda and Crystal HDU - 6007
应该注意到假如物品的费用可以被缩小的话 那一定是>=材料中最小的物品的费用所以可以先对每个物品求最小费用 然后再做一个完全背包#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#includ原创 2017-10-22 21:59:13 · 589 阅读 · 0 评论 -
Codeforces Round #300 E. Demiurges Play Again CF538E
首先考虑二分答案 假设是求max 那么把>=mid 的数字都变成1 另外的都变为0假设是A操作的时候那么肯定选一个需要放1尽量少的儿子下去 (因为二分的是mid) 假设是B操作那么要让他底下能选的地方都是1才能让他选到>=mid那么其实这样算出来的其实就是答案了当求min的时候就反过来 A操作的时候要让底下能选的都是0 B操作的时候选一个最少的0的下去#include <iostream>原创 2017-10-13 23:59:31 · 221 阅读 · 0 评论 -
Codeforces Beta Round #19 B. Checkout Assistant CF19B
记录状态dp[i]表示拥有的偷盗时间 那么买了一个物品就是+ti 偷就是-1 ti的范围很大 但是实际上最多只可以用n个 所以i的真实范围为[-n,n] 把整体范围往右移存在数组内做一个dp#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include原创 2017-10-14 17:40:21 · 204 阅读 · 0 评论 -
51nod 1052 最大M子段和
dp[i]表示把前i个数分成x份的最大和 pre[i]表示把前i个数分成x-1份的最大和进行m次dp#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#includ原创 2017-11-17 22:24:25 · 186 阅读 · 0 评论 -
Codeforces Good Bye 2017 D. New Year and Arbitrary Arrangement
首先考 虑dp [i] [j] 表示 i 个a j个子序列ab 时候执行算法的期望那么转移就是dp[i][j] = ( pa * dp [i+1][j] + pb * dp[i][i+j] ) / (pa + pb)因为长度可以任意长所以首先考虑初始化的位置可以发现当a的个数为k的时候再添加一次b就结束算法了 所以考虑初始化dp[k][x]PA = pa/(pa+pb) , PB = pb/(pa原创 2017-12-30 12:05:00 · 325 阅读 · 0 评论 -
Codechef CSUBSEQ February Cook-Off 2018 Chef and Chefness
用dpijkl记录每个状态的子序列最大长度 i,j,k,l表示以c,h,e,f结尾的合法子序列个数 因为k<=32所以每个最多只需要记录到32假如当前f结尾的合法子序列个数=K 那么后面的f都得删掉#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#inc原创 2018-02-19 10:54:17 · 194 阅读 · 0 评论 -
Educational Codeforces Round 58 (Rated for Div. 2) F (单调dp)
http://codeforces.com/contest/1101/problem/F容易发现对于每种起点终点组合的种类数很少所以考虑对于不同组合的最优答案用dp[ i ][ j ][ k ] 记录对于一个起点 i 到终点 j 分成 k+ 1段其中的最大值对于每个车的最优答案就是 c * dp[ s ][ f ][ r ]假如分成k段的话 可以考虑枚举最后一段或者最前一段假如断点是p...原创 2019-01-12 15:53:24 · 204 阅读 · 0 评论