
ACM_DP
文章平均质量分 59
luke2834
A junior researcher~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Leetcode 992. Subarrays with K Different Integers (DP + Two pointer)
题意给你一个长为NNN的数组AAA,返回AAA中满足条件的子串个数条件是:子串中恰好有KKK个不同的元素数据范围:N≤20000N \le 20000N≤20000思路这种子串的问题一般是用two pointer或者DP来解决,这个题比较有意思的是两种思路都要用到先根据DP的想法,我们考虑子问题,设前iii个元素这样的子串有F(i)F(i)F(i)个,必须以iii结尾的子串有f(...原创 2019-04-29 22:28:04 · 457 阅读 · 0 评论 -
Codeforces 615B Longtail Hedgehog (Round #338 (Div. 2) B题)
题意给你一个无向图,让你找到一个通路,路上的点是依次增大的,点的个数记为len然后找到所有连接到这条路末尾节点的边,数量为num找到最大的num * len思路基本是枚举以第i个节点为结尾得到的num * lennum很好得到,开个数组记录下就好len的话,用了个小dp,dp(j) = max(dp(i) + 1 , dp(j)) 存在(i,j)这条边存图直接只记录从小编号点到大编原创 2016-01-09 22:42:15 · 415 阅读 · 0 评论 -
Codeforces Round #336 (Div. 1) 607A Chain Reaction 简单dp
题意是在一条直线上坐落着不同位置的灯塔,每一个灯塔有自己的power level,当作是射程范围。现在从最右边的灯塔开始激发,如果左边的灯塔在这个灯塔的范围之内,那么将会被毁灭。否则会被激发,留下自己。现在可以从右边放置一个灯塔,位置和power level都可以自己定义。问各种情况中最小的灯塔被毁灭的数量。思路上来我就脑抽,觉得这是一个单凸函数。。。还傻了吧唧的写了个三分法。。。真是晕了。原创 2015-12-25 02:38:15 · 643 阅读 · 0 评论 -
Codeforces Round #336 (Div. 1) 607B Zuma 回文dp小总结
题意给你一个数列,你每秒可以从中删去一个回文子串,问你最少多少秒可以删完这个子串思路其实这类回文dp,方法都是类似的,用dp[i][j]表示从i到j这个子串最少多少秒可以被删完然后我们从中间向两边看更新dp,用dp[i][k]和dp[k+1][j]更新一下dp,再考虑a[i] == a[j]时单独更新一下dp就行了。比如之前做过的最长回文子序列,也是类似的想法具体来说这题,转移,对于一般原创 2015-12-25 00:29:28 · 662 阅读 · 0 评论 -
POJ 2686 状压dp
题意给你一个无自环、无重边的m个点,p条边无向图,边有权值你每走一条边,要用掉一张票,票也有权值,你的花费=边权/票权问你从a到b的最小花费。思路状压dp,dp[i][s]表示,当你手里还有票如集合s中所示,且你在i点,到b点的最小花费。转移也很好想,这里不多说了。。问题是,迭代顺序,我一开始没多想,就直接写了个记忆化搜索。。结果T了。。其实,仔细一下,发现更新dp[i][s]时,其原创 2015-12-24 12:06:42 · 393 阅读 · 0 评论 -
POJ 2392 简单dp 多重背包
题意有很多种石头,每种石头的高度是hi,但是不能放到ai之上的高度,并且这种石头有ci个将这些石头叠加起来,问能够达到的最高高度思路看白书上说是稍加思考的题目。。。为什么我觉得还没有优化递推关系的那些题难。。。和一般背包稍有不同的就是对石头按ai排序。。。然后再做。。这个很好理解这里就不多说了。。这样纯做,复杂度有点虚,不过dp常数小。。试了试就过了。。实现#include <iost原创 2015-12-23 13:30:34 · 443 阅读 · 0 评论 -
Codeforces 597C Subsequences dp + 树状数组
题意给你n的一个排列,问你包含k个数的子序列个数有多少。n <= 10^5,k <= 11思路dp状态dp[i][j] 表示前i个数,包含k个数的子序列个数有多少f[i][j]表示前i个数,以a[i]结尾的,包含k个数的子序列有多少dp[i][j] = dp[i-1][j] + f[i][j] 这个转移很容易想到具体f[i][j]怎么转移,稍微有点麻烦f[i][j] = sum f原创 2015-12-21 22:10:57 · 707 阅读 · 0 评论 -
hihoCoder 1068 RMQ-ST算法模板题
题意RMQ问题,Q个询问查询区间最小值思路dp(i,j) 表示[i, i+2^j]区间内的最小值dp(i,j) = min(dp(i, j-1), dp(i+2^(j-1), j-1) )查询[l,r]时,len = log2(l-r),min(dp(l, len),dp(r-(2^len), len) )实现#include <bits/stdc++.h>using names原创 2016-01-05 19:27:42 · 629 阅读 · 0 评论 -
Codeforces 609E Minimum spanning tree for each edge 树链剖分+RMQ(st算法)+最小生成树
题意就是给你一个有权无向图,无子环、无重边,问你,要求对每一个边i,必须在生成树里时的最小生成树的权值。思路这题思路不算太难想到,主要是第一次写树链剖分各种卡。。。这叫一个烦。。幸亏CF上可以看数据,要不然不知道调哪辈子去了。。。不瞎扯了,这题就是先跑一个最小生成树,得到权值A。然后遍历每个边,对于边{u,v},如果它本身就在最小生成树中,值就是A。如果不在树里,那么我们就需要看在树中的链原创 2015-12-20 14:08:07 · 1004 阅读 · 0 评论 -
RMQ的ST算法
原网址:http://blog.sina.com.cn/s/blog_6e63f59e0101598a.html关于RMQ的ST算法,以前也大略上看过,也写过程序,可是后来时间长了就忘记了,今天再看到,觉得并没有以前觉得的那么难理解。唉。毕竟以前弱。虽然现在也蒟蒻。ST算法的原理就是,nlogn预处理出Min[][]和Max[][],查询的时候O(1)查询。Max[j][i]或Min[转载 2015-12-20 13:45:05 · 450 阅读 · 0 评论 -
Codeforces 611C. New Year and Domino (Good Bye 2015 C题)
题意给你个矩阵,每个位置是空或者不空每两个相邻空的位置,可以放一个木条有q次询问,每次问你一个子矩阵中,放一根木条有多少种放法思路dp(i,j),表示左上角,这块的放法数,mark(i,j) 表示当前位置是否为空(1为空)dp(i,j) = dp(i-1,j) + dp(i,j-1) - dp(i-1,j-1) + (mark(i,j) && mark(i-1,j) ) + (mar原创 2015-12-31 16:04:24 · 767 阅读 · 0 评论 -
Codeforces 615C Running Track (Round #338 (Div. 2) C题) Trie + dp
题意给你两个字符串t,s你的目标是使用尽量少的t拼出s对于一个t,你可以做的是,只选取其中一个子串,正着或反着拼到s上最后需要拼出完整的s思路首先,题解说了一句贪心。。。然后我怎么也想不明白是咋样的贪心法。。。可能也和我没认真读题解有关。。我想的是,每次选取s中最长的可以由t得到的子串,这样贪心肯定是对的。但问题是s中有很多这样的子串时,我们不知道挑哪个?我一时想不明白了。。要是有恰好路原创 2016-01-10 23:27:03 · 581 阅读 · 0 评论 -
Codeforces 620F Xors on Segments DP
题意n个数,m次查询。n<=5e4,m<=1e3每次查询为一个区间l,r,要在n的数的[l,r]区间内选出2个数a,b(a<=b)计算f(a, b) = a^(a+1)^(a+2)^…^b,输出最大的这个值思路我想了好久,想到用莫队+Trie树了。。可是还是没想出来。。标程好像也是这样。。不过我没细看。。之后我会再尝试用这个方法解决~我参考了大神的博客,看到居然O(n^2)也能过。。。然原创 2016-01-29 17:50:51 · 955 阅读 · 0 评论 -
hihoCoder 1069 最近公共祖先 在线算法
题意多组询问,求最近公共祖先思路基本思路就是,把节点映射到一个数组的下标中,然后数组记录每个点的深度我们需要保证,每两个节点映射的位置间,存在只存在它俩的最近公共祖先,而不存在其它祖先我们先想一下,如果是一个二叉树,我们只要按照中序周游的顺序,存入数组中,是不是就满足要求了那么,现在这个树不一定是二叉的,那么类似二叉中序遍历,对u节点,访问完第一个子树后,存一下节点u的深度,再访问第二个原创 2016-01-30 00:53:36 · 985 阅读 · 0 评论 -
Leetcode 956. Tallest Billboard 背包DP(从优化问题等价变换得角度解释)
题意:nnn个小铁棒,第iii个棒长为lil_ili,你希望用这些小铁棒拼接出两个一样长得大铁棒,希望这两个铁棒得长度尽可能的长,要求每个小棒至多用一次数据范围:n≤20n \le 20n≤20,li≤1000l_i \le 1000li≤1000, ∑ili≤5000\sum_i l_i \le 5000∑ili≤5000思路:这个问题的话,我们乍一看就和背包问题的题面非常...原创 2019-04-22 18:17:07 · 534 阅读 · 0 评论 -
Leetcode 920. Number of Music Playlists 容斥原理(O(N log L)) or DP
题意给你n首不同的歌,有一个L长的播放列表,让你这用这些歌,在满足某种条件的前提下,把播放列表填满,问有多少种填法两个条件是:1. 每首歌至少用1次;2. 如果一个歌放在了第i个位置上,则下一次它最早只能出现在i+k+1的位置上思路这个题可以dp求解,思路也是非常巧妙,我之后会补充上来这里主要讨论用容斥原理的做法,复杂度会比dp的来的低一些我们先考虑,如果没有第一个条件,只有第...原创 2018-11-11 14:29:07 · 727 阅读 · 0 评论 -
Leetcode 741. Cherry Pickup DP
题意一个n*n矩阵A,矩阵包含-1, 1, 0,其中-1不能通行,从矩阵左上角走到右下角,再走回左上角,第一次遇到1收益+1,第二次则不加,问你最大收益。思路这个题困扰我好久,网上题解包括discussion感觉都不是特别直观,现在终于完全想通了。。这里记录一下,希望能对大家有帮助。这个题如果没有反复,那么显然可以用一个普通二维dp,直接求解那么首先,我们想到的肯定是一个...原创 2018-02-24 21:48:20 · 2859 阅读 · 4 评论 -
Leetcode 312. Burst Balloons 经典二维dp
题意给定n个一排的气球,i-th气球有一个权重num[i],扎破i-th气球收益是nums[left] * nums[i] * nums[right],问最大收益思路一种比较典型的dp,就是矩阵连乘的扩展状态定义为dp(i, j)表示区段(i, j)上,不扎破i, j的情况下的最优解状态转移:dp(i, j) = dp(i, k) + dp(k, j) + nums(i)...原创 2018-02-24 01:01:53 · 266 阅读 · 0 评论 -
Leetcode 221. Maximal Square 单调队列和dp两种思路求解
题意给定一个0,1矩阵,希望找到矩阵中的一个面积最大的联通正方形区域,这个区域中全是1思路基本思路:找面积最大的,其实就是找最长的边长,我们的思路都是以这个为出发点的dp思路整体来看,就是一个二维dp,是这类矩阵问题的一个常用状态设置方法:dp(i,j)dp(i,j)dp(i, j) 的含义是以(i,j)(i,j)(i, j)为右下角的最大正方形边长然后递推...原创 2018-02-20 02:56:47 · 518 阅读 · 0 评论 -
leetcode 630. Course Schedule III 优先队列优化DP
题意有n节课要被安排,每节课包含两个信息(t, d),前者是课程时间(duration),后者是最晚结束时间,问你从1时刻开始安排,最多可以安排几节课。思路我们先想贪心,没有找到特别好的贪心策略,但是可以想到一个结论,就是在满足最晚结束时间一样的前提下,t 小的一定比t大的安排优先级高,可以很容易的反证一下。那么基于这个思路去想dp,先按照最晚结束时间排序,记录两个信息,s...原创 2018-03-08 02:55:08 · 515 阅读 · 0 评论 -
leetcode 403. Frog Jump DP
题意n个石头排成一行,i-th石头所在位置是pos(i),假如青蛙目前在i-th石头上,且它是从前面石头跳了k单位长度过来的,则它接下来可以跳k + 1, k - 1, k单位长度远,初始在0位置,且只能跳1单位长度,问它能否跳到最后一个石头。(n < 1100)思路这个题我们最简单的dp思路,就是dp(i, k)表示在第i个石头上,且从上一个石头跳k单位长度过来,是否可行...原创 2018-03-08 02:35:45 · 861 阅读 · 0 评论 -
hihoCoder 1476 矩形计数 dp
我们通过dp来求解这个问题。我们定义dp(i,j)表示前以(1, 1)作为左上角,(i, j)作为右下角构成的子矩阵所具有的矩形个数。 递推的时候,基于简单的容斥原理思想,不难发现:dp(i,j) = dp(i-1, j) + dp(i, j-1) - dp(i-1, j-1) + 用(i, j)作为右下角的子矩形个数 递推式的前三项的运算得到的是不用(i, j)作为右下角的子矩形个数,而最后一项则需要稍微复杂一些的计算得到。原创 2017-03-19 09:01:45 · 1351 阅读 · 0 评论 -
Leetcode 45. Jump Game II dp优化 (给出了5种思路)
题意给你一个n长的数组a,a[i]表示从i跳一步,最远距离问你,从0出发跳到n-1的位置最少需要几步思路这题挺有意思的,我想了4个思路,2个T了,1个实现起来比较麻烦。。就记录下几个思路,感觉都是经典思路。。思路1:这题很容易就能想到个dp的思路,dp[i]表示跳到i的最短距离,dp[i] = min(dp[j] + 1) if j + nums[j] >= i,一维dp加遍历,O(n^原创 2016-11-05 13:42:25 · 785 阅读 · 0 评论 -
hdu2147 简单博弈dp
题意一个n*m的矩阵从右上角开始,两个人可以选择向左、下或左下移动,问先手能否取胜思路dp(i,j)表示到达i,j点的状态为必胜态还是必败态预处理2000*2000的dp,之后查询即可注意,空间给的很小,更新dp的时候最好用迭代的方式实现#include <bits/stdc++.h>using namespace std;bool dp[2002][2002];typedef p原创 2016-01-13 21:39:01 · 482 阅读 · 0 评论 -
Codeforces 611D New Year and Ancient Prophecy (Good Bye 2015 D题)
题意给你一个数字组成的字符串把它分成几个子串,使得每个串组成的数,没有前导0,且位置在前的字符串组成的数要严格小于位置在后的字符串问你有多少种不同的分法思路dp,dp(i,j)表示以i结尾的子串,它划分后,最后一个串长度小于等于j的分法数。当更新dp(i,j)时,我们看子串str(0, i-j),它能不能放一个j长的子串,也就是说,如果以i-j结尾的,j长子串 < 以i结尾,j长子串时,原创 2015-12-31 13:40:13 · 842 阅读 · 0 评论 -
POJ 3734 矩阵加速dp
题意n长序列,每个位置可染4种颜色,问你第1,2种颜色都染偶数个位置的染色方法数。思路递推,a[i]表示前i个位置,题中所问,b[i]表示颜色1是偶数且2是奇数的染色方法数,c[i]表示2是偶,1是奇的方法数,d[i]为都是奇数时的方法数a[i] = 2*a[i-1] + b[i-1] + c[i-1]b[i] = 2*b[i-1] + a[i-1] + d[i-1]c[i] = 2*c原创 2015-12-28 20:37:23 · 396 阅读 · 0 评论 -
Uva1401 Trie树 + 简单dp
题意 给你m个短字符串和一个长串,问你长串拆分成由短串组成的方法数。思路 dp[i] 表示从i开始的长串后缀,可以用短串组成的方案数。dp[i] += dp[i+len(x)] 其中x是从i开始的长串后缀的前缀,这个前缀属于短串集合。初始条件dp[n] = 1. 用短串建立Trie树,用长串后缀去在字典树上匹配,找到满足条件的短串,更新dp注意:Trie树原创 2015-04-05 16:25:26 · 712 阅读 · 0 评论 -
POJ3181 dp递推关系小优化 高精度数模板 Java练习
题意 给你n和m,问你用1...m这些数,每种无限个,相互组合,形成求和为n的方案数。思路 dp(i,j) 表示组成求和为i,且选用的这些数最小的要>j方案数。 转移:dp(i,j) = dp(i,j+1) + dp(i-j,j) 注意最后数会超long long 用高精度数。C++:#include #include #include #include原创 2015-04-02 16:27:10 · 479 阅读 · 0 评论 -
POJ1742 多重背包 递推关系优化
题意 给你n种钱币,每种面值Ai,数量Ci,问你能凑成的不超过m的面值数量思路1 这是我起初的想法,优化了半天还是超时了...不过这里还是说一下,有些想法今后可能还会用到。 完全仿照多重背包的求解,把Ci拆分成一些2的次幂加和的形式,具体可参看背包九讲~但这样复杂度多出了一个logC,就会超时...然后我想m种面值不可能都达到,因此我每次只遍历已经达到了面值,然后更新出来的新值加原创 2015-03-18 10:52:59 · 822 阅读 · 0 评论 -
hihoCoder1044 简单状压DP
题意 1到n的序列,每个位置wi个垃圾,一个人打扫,但连续m个位置最多有q个位置被打扫,问你最多打扫多少垃圾思路 由于m较小,所以可以使用状压dp(当然本来这题就是专门练状压dp的...)。总体思路不难,但有一些地方卡了我一下的这里说一下,一是连续m个位置看起来比较复杂不好处理,但是仔细一下可以发现,如果当看到第i个位置时,只需要考虑它和它前面m-1个位置就可以了,它后面的由后续工原创 2015-03-12 18:05:49 · 1357 阅读 · 2 评论 -
Uva 437 DAG上的DP 记忆化搜索实现
题意 #include #include #include #include #include #include using namespace std;const int inf = 0x3f3f3f3f;typedef pair PII;typedef pair PI;#define MP make_pair#define PB push_back原创 2015-03-17 14:06:04 · 852 阅读 · 0 评论 -
POJ2385 简单DP
题意 两棵苹果树,每一分钟某一颗树掉一个苹果,一个人接苹果,她每一次掉落苹果时只能在一棵树下等待。给你总时间T,人最多可以在两棵树间移动的次数W,还有每分钟是哪棵树掉苹果,问你她最多接多少个苹果。思路 dp(i,j,k)表示在前i分钟,最多移动j次,并且在i分钟站在第k棵下时最多接到的苹果数。a[i]表示i分钟时哪棵树掉。 状态转移 dp(i,j,a[i]) = max(dp(i-1,原创 2015-03-11 12:31:43 · 598 阅读 · 0 评论 -
POJ3616 简单DP
题意 有m个区间,区间有一个权重,区间间有交叉,问你怎么选择区间让权重之和最大思路 这题递推时,主要要想到,如果新的区间和之前选好的那个区间有交叉,那么去掉已选好区间最后面的那个区间,新的区间一定可以放进去。dp[i]表示前i个区间,第i个区间一定放入的最大权值和。先按开始时间进行排序。当start[i] >= end[j]时,dp[i] = max(dp[i],dp[j]+val原创 2015-03-14 12:07:08 · 500 阅读 · 0 评论 -
POJ3280 串上的DP
题意 一个字符串,可以在任意位置加字符或者删去任意字符,使得字符串成为回文串。加不同字符或删去不同字符有不同的代价,问使得它成为回文串的最小代价是多少?思路 这题本身不难,和最长公共子序列很相似,但我做类似的dp较少,状态没有找好,费了不少功夫。下面列出破题的主要几个重点:(1)删去和添加同一个字符本质是一样的,只要取那个代价小的就行(2)状态取从i位置到j位置的最小代价,dp[i][原创 2015-03-15 20:10:50 · 443 阅读 · 0 评论 -
UVa1025 DP (还要再看看~)
题意 请参考紫书描述~思路 状态开始没有定好,还是参考了下紫书.. dp[i][j] 表示在第i秒,第j个站上,一共的最少等待时间 初始条件dp[T][n] = 0,其它赋值为inf 转移:(1)在该站等一分钟(2)若有向左走的车,则可以乘上(3)若有向右走的车,则可以乘上 更新顺序:时间i倒着遍历 注意:数组要原创 2015-03-16 18:54:06 · 1518 阅读 · 0 评论 -
poj2229 简单DP
题意 把n拆分为2的幂相加的形式,问有多少种拆分方法。思路 比较好的DP方案开始没有想到,所以这里列出两种方案吧 (1)DP(i,j)表示第i个数,最小数由2的j次方来组合得到的方案数。状态转移dp[i][j] = (dp[i][j+1] + dp[i-(1初始条件 dp(1,0) = 1 (2)更好更简单的方法是分奇偶考虑,奇数时就是dp(i) = dp(i-1)原创 2015-03-10 21:03:15 · 392 阅读 · 0 评论 -
hdu2089 初学数位dp
#include #include #include using namespace std;#define maxn 1000001#define maxlen 8int n,m;int f[maxlen][10];void yu(){ f[0][0] = 1; for(int i=1;i<maxlen;i++) { for(int j=0;j<=9;j++)原创 2015-04-06 12:29:57 · 436 阅读 · 0 评论 -
hdu3652 数位DP
#include #include #include #include using namespace std;const int maxlen = 11;int f[maxlen][10][2][13];int pow10(int x){ int ret = 1; for(int i=0;i<x;i++) ret *= 10; return ret;}voi原创 2015-04-08 11:09:11 · 418 阅读 · 0 评论 -
URAL 1057 数位DP
#include #include #include #include using namespace std;const int maxb = 11;const int maxk = 21;const int maxlen = 32;typedef unsigned int ui;const ui inf = ((ui)1<<(ui)31) - (ui)1;ui f[ma原创 2015-04-07 23:39:23 · 499 阅读 · 0 评论 -
UESTC1218 2015CCPC DP 0,1背包
题意给你n个小木棍,每根有长度和权值,一维的把它们放到一个长为L的平台上,只要木棍重心在平台上,即可认为可以放上去,问你怎么放,权值最高。n<=1000, L <= 2000思路在0,1背包的基础上加一维,维护两端放出去的木棍现在有几个求出后在和考虑只放一根木棍的情况,和n个木棍的权值求max即可注意的是,要想到取一半的时候有小数的问题,所以预先把所有长度乘二。实现#include <原创 2015-11-01 07:56:53 · 522 阅读 · 0 评论