DP
文章平均质量分 54
Joey丶sunk
古今成大事者 不惟有超世之才 亦必有坚忍不拔之志
展开
-
HDU - 5791 Two 简单 dp
简单 dp 稍微推一下就出来了 可以画个n * m 的矩阵 手动推一下 a [ i ] == b [ j ] 和 a [ i ] != b [ j ] 时的关系递推关系式 #include #include #include #include #include #include #include #include #include #include #原创 2017-09-02 15:27:45 · 224 阅读 · 0 评论 -
斜率优化讲解 (例题:Print Article HDU - 3507 斜率优化)
斜率优化的学习: 题意: 将序列划分,每段花费如题:区间和平方+m; 求最小花费; 思路: 用dp[i] 表示前i个数划分的最优解,sum[i] 表示前i个数的和 显然dp[i] = max ( dp[j] + (sum[i]-sum[j])² + m ) for j : 0 to i-1; 复杂度O(n²):× 即需用到“斜率优化”; 对于一般的n²-dp方程,可能有...原创 2018-08-07 13:45:37 · 244 阅读 · 0 评论 -
HYSBZ - 1010 玩具装箱toy dp+斜率优化
题意:略 思路:见上篇博客详解https://blog.csdn.net/xiang_6/article/details/81479453 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #in...原创 2018-08-07 14:39:24 · 150 阅读 · 0 评论 -
Codeforces Round #501 F. Bracket Substring 思路+dp+KMP 详解
题意: 给定n和一个括号序列 t,问:一个长度为2*n 的括号序列 s 的种类数,要求 t 是 s 的子串,s是平衡括号序列; 思路: 这个题算是 BZOJ - 1009: [HNOI2008]GT考试 dp+KMP https://blog.csdn.net/xiang_6/article/details/81434904 的简化版本; 解释一下这个题: 首先我们不考虑是否是平衡...原创 2018-08-08 11:22:29 · 465 阅读 · 2 评论 -
UVALive - 8468 (计蒜客) Coins 概率dp+详解
题意: 给定n个硬币,初始美国都是方面超上,m次机会,每次必须选k翻转,问采取最优策略的翻转方式,得到的正面朝上的期望是多少 思路: 这题按说需要高精度,但是懒得写,用double过了,可能是因为保留的结果的位数较小,不会误差那么大 首先,最优策略就是:每次选取k个的时候,我们先选反面朝上的硬币,如果不够,再选正面朝上的, 因为每次的翻转只跟上次的翻转情况有关,所以我们可以推导一下递推式...原创 2018-08-13 09:48:16 · 196 阅读 · 0 评论 -
HihoCoder - 1636 Pangu and Stones 区间dp
题意: 给定n堆石子,每次可以合并其中相邻的一些堆,合并的数目在区间[L,R]中,每次合并的花费是他们数量的和 思路: 明显的区间dp,但是有个点很巧 因为每次合并都要限定合并的个数,所以区间dp的时候要记录个数状态; 容易想到的是方程是:dp[i][j][k] 表示把 i 到 j 区间合并后,得到 k 堆石子的 最小花费, 唯一的转移的方式就是合并成一堆的时候, 其余的情况只是等式...原创 2018-08-30 22:06:07 · 136 阅读 · 0 评论 -
ACM-ICPC 2018 南京赛区网络预赛 E.AC Challenge 状压dp
题意: 给定n个作业,每个作业有两个值a,b, 第i天完成这个作业会得到value :i*a + b; 但是完成这个任务之前需要完成一些别的任务 思路: 乍一看像是搜索,但是似乎不太行(好像可以写过) 但其实一想,更是dp,状态数(1<<20) ,显然可以状压,想到dp[i][t] 表示 当前做完第i个作业,状态为t时的最大value 然后可以直接滚动数组, dp[t...原创 2018-09-04 00:01:53 · 176 阅读 · 0 评论 -
HDU - 6249 Alice’s Stamps dp+线段树+讲解
题意: 给定n个区间 [Li, Ri] ,让你选择最多 k 个,问区间的并最大是多少; 思路: 看网上题解都是n^2 对区间进行操作的,我的方才比赛做法是n^3 优化成n^2 * logn的 首先我们去重,按照区间右值排序,用dp[i][j] 表示当前选到第i个区间,已经选了j个区间的最大区间并的长度,这样的话进行下次转移的时候,我们还得考虑前面选了的区间的最右值是多少,这...原创 2018-09-07 14:21:53 · 295 阅读 · 0 评论 -
Codeforces Round #512 E - Vasya and Good Sequences 思路+dp+暴力详解
题意: 给定一段长度最大为 3e5的序列,每个数的二进制位的1和0可以互换,即二进制1的个数相同的数可以互换, 问有多少个连续的子序列(子区间),在可以使用上述互换的条件下,能够达到区间异或和为0 思路: 有前面的互换我们可以知道,对于给定的每个a[i] 我们只需要考虑其二进制位有几个1就OK了; 可是我想的是这个连续自序列必须满足“可以划分成相等的两部分”,后来想到(正解): 只要和...原创 2018-09-25 19:45:59 · 300 阅读 · 3 评论 -
C. Greetings! dp+枚举子集的子集 The North American Invitational Programming Contest 2016
题意: 给定n种信件,k种信封(每种假设无数个);每种信件有一个w,h(宽和高),还有数量 t,w和h不能倒置, 要用信封装信件得比信件大,,,大,,,==雾 如果k<n,那必然有的小信件要用比较大的信封装,那样会浪费一些空间,问最小的浪费的空间是多大; 思路: 假算法:开始想的是贪心,n种信件,假设开始有n种信封,此时浪费的是0;然后每次合并两种信件,用同种信封,这时候会浪费一些...原创 2018-10-03 10:58:29 · 279 阅读 · 0 评论 -
F. Mountain Scenes dp The North American Invitational Programming Contest 2016
题意: 给定n个1*1的小正方形,一个w * h 的框子,任意放置,符合物理上的上下规则;问有多少种放置方法 思路: 开始想的是按层dp;事实上是不行的,复杂度很高, 然后想到了按列dp,这样我们还需要有一维表示用了多少个小正方形, 所以得到dp方程: dp[i][j] 表示前i行,一共用了j个的所有种类数 在求解dp[i][j] 时:枚举第i列放置的个数 k,dp[i][j] = s...原创 2018-10-03 11:57:37 · 231 阅读 · 0 评论 -
Codeforces 1067A - Array Without Local Maximums 计数dp+详细推导 (Codeforces Round #518 (Div. 1))
CF: *2000 比起同难度级别的题,dp可真的难做,可能是我做dp的题太少了吧。。。。 题意: 给定一个长度为n(1~ 1e5)的序列a[],其中a[i] 应该在1-200中间,但是有的值看不到了,用-1表示, 但是知道的是对于 1 < i && i < n 这样的i :a[i] <= max(a[i-1], a[i+1]) ,并且 a[1] ...原创 2018-11-06 22:44:32 · 571 阅读 · 0 评论 -
BZOJ - 1009: [HNOI2008]GT考试 dp+KMP
题意: 给定字符串ch,问长度为n的字符串,有多少种可能不包含字符串ch 思路: 算是比较经典的dp的题,我们首先容易想到包含这个串的字符串有多少个,但是发现难以实现, 然后我们用递推的方式来直接求解不包含这个串的新串的个数, 令dp[i][j] 表示 我们维护的当前串长度为 i,并且其包含j个字符的后缀 恰好是ch串的前缀, 那么答案ans即为 ans += dp[n][i] : ...原创 2018-08-05 20:24:27 · 233 阅读 · 0 评论 -
CodeForces 977F Consecutive Subsequence 离散化+dp
题意: 给定长度为n的序列a[] (n<=1e5 && a[i] <= 1e9),要求输出最长的相邻数值差一的最长上升序列; 思路: 如果a[i]很小的话,我们可以用dp[j]表示以j结尾的序列的最大长度, 然后从左往右遍历,对于当前a[i],我们可以得到递推式:dp[a[i]] = max( dp[a[i]], dp[a[i]-1]+1 ); 然后想到对a[...原创 2018-05-20 21:29:12 · 264 阅读 · 0 评论 -
HDU - 6201 transaction transaction transaction 2017 ACM/ICPC Asia Regional Shenyang Online
树形dp 结构体数组存两点之间关系 dp [ i ] 表示以 i 结点为结尾时 最大的盈利值,进行更新后遍历dp 数组找最大的 answer #include #include #include #include #include #include #include #include #include #include #include #include #inclu原创 2017-09-13 00:14:08 · 258 阅读 · 0 评论 -
51Nod - 1021 石子归并 区间DP入门-分析
题意: 合并相邻石子,使花费最小 思路: 相邻的这个条件,决定了是区间相关的最优问题,事实上这是个区间DP的入门题 区间DP 枚举区间长度,对于本区间获得最优解,当分析更大的区间时,可由这个区间推出 #include #include #include #include #include #include #include #include #include #include #原创 2017-11-09 15:08:41 · 311 阅读 · 0 评论 -
HDU - 1520 Anniversary party 树形dp入门+见解
题意: 给定n个人,和他们的直系领导关系,每个人有一个值, 一个宴会邀请他们中的一些人,如果邀请了员工,他的直接领导就不能被邀请了,如果邀请了领导,他的直接员工就不能被邀请了 问邀请到的所有人的值最大是多少 思路: 给定的是一棵树的形状,不会存在环,由于在选某个人的时候选与不选,对他的领导和员工都有影响,所以需要动态的处理 需要用到dp,而每个点可选可不选,我们可以想到 再加一维表示,原创 2017-11-10 11:46:17 · 219 阅读 · 0 评论 -
SGU - 168 Matrix 简单递推
简单递推一下, #include #include #include #include #include #include #include #include #include #include #include #define PI acos(-1.0) #define in freopen("in.txt", "r", stdin) #define out freopen("out.原创 2017-11-03 13:38:49 · 279 阅读 · 0 评论 -
UVA - 147 Dollars dp子集和问题
dp处理子集问题 dp 【 i 】 表示合成 i 元的方法种数 #include #include #include #include #include #include #include #include #include #include #include #define PI acos(-1.0) #define in freopen("in.txt", "r", std原创 2017-11-03 18:11:13 · 229 阅读 · 0 评论 -
Codeforces Round #374 (Div. 2) 721C Journey DAG上DP
DAG 上动态规划 跑一遍dfs 转移状态,记录路径 #include using namespace std; const int maxn = 5007, INF = 0x7f7f7f7f; int n, m, len; int edge[maxn][3]; int f[maxn][maxn]; int g[maxn][maxn]; int route[maxn]; in原创 2017-11-17 19:34:56 · 300 阅读 · 0 评论 -
UVA - 1347 Tour DP
题意: 给按x大小给定一些x值不同的点,问从最左边走到最右边再走回来,每个点走一遍,形成一个环,最短路径是多少 思路: 我们可以确定的是左右断点是确定的,我本来想的是,对于点来说,分到上下方的,,再往下就不知道了 后来看紫书才知道:一个状态量 dp[ i ] [ j ] 表示前第 i j 两个点(包括之前的点)走完以后,到第n个点的最短距离 过程包括: 边界:第 n-1原创 2017-12-04 17:40:48 · 237 阅读 · 0 评论 -
SGU - 143 Long Live the Queen 树形dp之加和问题
树形dp加和问题;从一个点开始dfs,以这个点为根,对他的子节点dfs,他的子节点遍历的时候不会包含他本身,等下证明正确性;如果他的子节点作为根遍历完了以后,子节点的值大于0时,将这个值加到当前结点;证明正确性:首先如果这个点权值是负数,那对他子节点dfs的时候,没必要加上他;如果这个点的权值是正数,算完后可以的话直接加在上面就行了;#include<bits/stdc++.h> us...原创 2018-03-28 15:13:57 · 186 阅读 · 0 评论 -
UVA - 10617 Again Palindrome dp计数问题+记忆化
递推;直接地dp[i][j] 表示 i~j 区间种类数,递归求解数目的转移:①当s[i] == s[j] 时,dp[i][j] = dp[i+1][j] + dp[i][j-1] + 1;我们考虑:dp[i][j] 中肯定包含dp[i][j-1], 至于加上dp[i+1][j] 时候会有重复,这时候重复的部分一定是 (i+1)~(j-1) 中的情况,恰好s[i] == s[j] 加上s[i]和s[...原创 2018-03-28 15:24:28 · 150 阅读 · 0 评论 -
HDU - 4960 Another OCD Patient 记忆化
题意:给定序列a,合并多个连续的段,使得整个序列成为回文序列;下一行给定序列v,v[i]表示合并i个数需要的花费;思路:可以直接记忆化往下递归,可能数据不够强,能够(900ms)卡着时间过,当然内存消耗也很大;另一种真实的dp见下篇博客; 手动滑稽#include <iostream> #include <cstdio> #include <cstring> #...原创 2018-05-02 20:29:31 · 201 阅读 · 0 评论 -
HDU - 4960 Another OCD Patient 真实的DP
题意:给定序列a,合并多个连续的段,使得整个序列成为回文序列;下一行给定序列v,v[i]表示合并i个数需要的花费;思路:需要的是回文序列,我们可以考虑到分别从两边合并;sum[i] 表示a序列前缀和; id[i] 表示 跟sum[i]相同的后缀的位置,不存在为-1;dp[i] 表示前i个合并完并且最后到id[i]位置也合并完的最小花费;这个代码很满意比上一篇好多了;#include <ios...原创 2018-05-02 20:35:29 · 155 阅读 · 0 评论 -
Codeforces Round #513 E. Sergey and Subway 树形dp (树+dfs) 树上任意两点距离和
CF: dfs and similar dp trees *2000 题意: 给定一个n个点的树,(n最大2e5),如果原图(树)中有边 u-v, v-w ,那么现在你可以连一条边u-w; 问任意两点间最短距离的和; 思路: 开始想的对原树dfs,用dp[i][2] 分别表示到i结点距离为偶数和奇数的最小花费,但是很麻烦。。。 其实:按照题目给定的要求,我们...原创 2018-11-09 19:40:47 · 340 阅读 · 0 评论