动态规划
Masker_43
这个作者很懒,什么都没留下…
展开
-
LCS问题
概念明晰:- longest common sub-sequences:最长 公共 子-序列子串:按原顺序依次出现,不可以跳过某元素子序列:在保持元素前后关系的前提下,可以跳过某些元素的序列...原创 2019-04-16 13:23:18 · 4722 阅读 · 1 评论 -
【Common Subsequence】
思路:动态规划LCS问题。注意往后腾一枚空间。核心:for(int i=0;i<l.length();i++) for(int j=0;j<r.length();j++) if(l[i] == r[j]) dp[i+1][j+1] = dp[i][j] + 1; else dp[i+1][j+1] = max(dp[i+1][j] , dp[i][j...原创 2019-07-14 14:53:49 · 129 阅读 · 0 评论 -
LIS、LCS
LIS:Longest Increasing Subsequence朴素三角dp,注意初始化为1:int ans = 0;for(int i=1;i<=N;i++) dp[i] = 1;//自己开始自己结束,长度自然为 1 for(int i=1;i<=N;i++){ for(int j=1;j<i;j++) if(A[i] > A[j]) d...原创 2019-07-14 17:40:18 · 137 阅读 · 0 评论 -
【C - Monkey and Banana】
思路:最长上升子序列的变种。数字改成了结构体 BLOCK,并且不仅要求出长度,本题需要求出最高的高度。每个 BLOCK 都是无限的,因此每块都可以变成六块。然后按底面的长排序(贪心),正方形 dp 求解。注意 ans 的使用(dp[i] 的意义)。代码:核心:正方形 dp 求解最长上升子序列#include <iostream>#include <algo...原创 2019-07-10 16:37:37 · 225 阅读 · 0 评论 -
【J - FatMouse's Speed】
思路:LIS变种,输出路径,故使用三角形动归比较方便。坑不少,还是做出来了。合并成一句话:因为是倒序输出,想要先输出 w 小(v 大)的;因此要把 w 小的放后边,因此要在 sort 时把 w 小的放后边代码:15ms 1440kB//15ms 1440kB#include <iostream>#include <cstring>#inclu...原创 2019-07-14 23:29:38 · 161 阅读 · 0 评论 -
【D - Doing Homework】
思路:状态压缩 dp。一共十五种课程,我们使用一个整型数的二进制表示已经上过的课程。如000 000 000 000 101(数5)代表当前状态已经上完了第一、三种课程。其实严格来说,我认为它更多的是一种暴力贪心的思想。因为:我们需要依次从小到大枚举所有的状态,每一种状态都只需要使用已经推过的子状态,并且在其中选择当前最优状态更新自身。注意:状压 dp都会用到位运算,位运算必须要一步一括...原创 2019-07-12 11:12:21 · 330 阅读 · 0 评论 -
【E - Super Jumping! Jumping! Jumping!】
思路:裸的 dp,十分简单,第一次没查题解就顺利做出来了。其实,dp 的关键就在 dp[i] 代表必须使用物品 i,以及 dp 和枚举的综合使用。注意,一旦 dp[i] 代表必须,则 ans 不要忘记。代码:15ms 1420kB//15ms 1420kB#include <iostream>#include <algorithm>#inc...原创 2019-07-12 11:36:33 · 105 阅读 · 0 评论 -
【F - Piggy-Bank】
思路:完全背包,做过两遍了。内层循环顺序,因为同样的钱币可以选择多次。代码:62ms 1464kB//62ms 1464kB#include <iostream>#include <algorithm>#include <cstring>#define INF 0x3f3f3f3fusing namespace std;c...原创 2019-07-12 11:56:26 · 125 阅读 · 0 评论 -
【P - FatMouse and Cheese】
思路:记忆化搜索,注意本代码成立的前提是“He eats up the cheese where he stands and then runs either horizontally or vertically to another location.” 即每次行动时只能选定一个方向猛冲。代码:140ms 1492kB//140ms 1492kB #include &l...原创 2019-07-23 20:45:06 · 156 阅读 · 0 评论 -
【Q - Phalanx】
思路:最大对称子矩阵,一开始就有些思路,搜了下题解发现差不多就直接动手写了,A的好开心。算是枚举吧,其实大部分 dp 都是优化的枚举嘛,本题略有看表填格的影子。dp[i][j] 代表以 mp[i][j] 为左下对角元的最长对称矩阵边长。写法要注意,本代码写的稍微有一点点取巧。代码:2964ms 6344kB//2964ms 6344kB #include <io...原创 2019-07-23 23:47:54 · 360 阅读 · 0 评论 -
【S - Making the Grade】
思路:动态规划+离散化。数据范围过大,需要离散化:A【】是原数组,U【】是去重数组,dp【】是代价。心路历程:令 dp[i][j] 代表前 i 个数符合某规则并且将最后一个元素改成数字 j 所付出的总代价,得到一个 TLE。使用滚动数组,将 dp[maxn][maxn] 改成一维,仍然 TLE。使用变量 PRESUM,降低时间复杂度。注意:两种规则(不升\不降)只需要一次 r...原创 2019-07-29 12:40:09 · 650 阅读 · 0 评论 -
【动态规划】
分类:字符与串:【A - Max Sum Plus Plus】:M子段最大和。取已知数填格:原创 2019-07-29 21:02:29 · 105 阅读 · 0 评论 -
【K - Jury Compromise】
思路:哭了,真难使用了晶之王的方法。dp[i][j] 代表已经选取了 i 个人,且这 i 个人的辩控差为 j 时的辩控和。没有做出来的一部分原因是,好像之前做的动归题都是取表填目前格(背包问题)的,但本题是取格填未来空的。代码:32ms 2024kB//32ms 2024kB #include <iostream>#include <cstrin...原创 2019-07-22 17:33:20 · 164 阅读 · 0 评论 -
【L - Common Subsequence】
思路:之前做过总结了。可以看出滚动数组对时空均有明显优化。代码:47ms 4648kB//47ms 4648kB#include <iostream>#include <cstring>#include <algorithm>#include <string>using namespace std;const...原创 2019-07-22 18:39:21 · 86 阅读 · 0 评论 -
【M - Help Jimmy】
思路:另一种动归思路:从最优子结构入手,属于查表填格的做法。借鉴自_pkm_的BLOG。代码:16ms 728kB//16ms 728kB#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#define INF 0x3...原创 2019-07-22 21:22:14 · 197 阅读 · 0 评论 -
【N - Longest Ordered Subsequence】
思路:LIS,前几天写过啦,N^2,NlgN。代码:N^2:32ms 700kB//32ms 700kB#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1005;int N;int...原创 2019-07-22 21:41:25 · 96 阅读 · 0 评论 -
【O - Treats for the Cows】
思路:新类型:区间dp。dp[l][r] 代表在区间 [l,r] 内可以取到的最大值,注意,我们是从小到大逐步蚕食增大区间的,根据题意,可知在整个过程中是最后取本区间内的值。注意初始化,枚举时先枚举长度,再根据长度枚举起点。代码:47ms 14560kB//47ms 14560kB#include <iostream>#include <algor...原创 2019-07-23 12:04:41 · 181 阅读 · 0 评论 -
【I - 最少拦截系统】
思路:一:这是一道经典的动归题目,经典在它可以牵引出 Dilworth定理、LIS(Longest Increasing Subsequence)。先说 Dilworth:Dilworth定理包含如下知识:偏序集、链、反链。Dilworth 包括两个对偶定理:最大链长度 = 最少反链划分数。最大反链长度 = 最少链划分数。那如何使用该定理呢?非常简单。以本题为例:求最少...原创 2019-07-14 13:41:52 · 162 阅读 · 0 评论 -
【B - Ignatius and the Princess IV】
思路:暴力:存储所有数字,sort,其中位数一定是答案。动态规划:取消数组,维护两个变量 cur 和 num。新读入的数如果是 cur,num++;如不是 cur,则 num- -。因为目标出现次数超过一半,所以当目标数全都在一起时,最后也有 num>0;在分散最开的情况下,两两抵消,最后三个数中出现两次的即为答案。故做法成立。代码:暴力:187ms 2544kB//1...原创 2019-07-10 12:03:37 · 98 阅读 · 0 评论 -
HDOJ 1114 【Piggy-Bank】
思路:首先,01背包是一定的,它的特殊之处有:1.必须装满到W,并且要判断出是否可以恰好装满2.要找出每个状态的最小金额针对第一点,有两种初始化方式:for(int i=1;i<=n;i++){ cin>>v[i]>>w[i]; dp[w[i]] = min(dp[w[i]] , v[i]);}dp[0] = 0;for(int...原创 2019-04-21 09:33:50 · 184 阅读 · 0 评论 -
洛谷 P1853【投资的最大效益】
原题链接思路:不难看出是完全背包类问题,只是要明确一点,“花钱”买债券所花的钱并没有真正的花出去,关键就在于随时都可以卖出任何所持有的债券。那么,实际上我们可以认为每一年都先把所有持有的债券变卖套现,然后拿着全部的现金重新购买债券(重新打背包),寻找能够获得的最多的金钱。明白了这一点,就可以写出最简单的一版答案。dp【】记录 j 金钱能够获得的最多的本金+利润。注意答案是最后能到达的最大背...原创 2019-04-21 13:34:46 · 687 阅读 · 1 评论 -
HDOJ 1059【Dividing】
原题链接多重背包,装满,w[i] == v[i]因为是第一次做多重背包,我首先试图将所有可能装出的重量枚举出来,TLE。代码如下://1000MS(TLE) 1520K#include <iostream>#include <cstring>using namespace std;const int maxn = 10;const int ma...原创 2019-04-21 19:20:19 · 186 阅读 · 0 评论 -
背包问题学习路径
切身受益,故而转载:学习背包问题,需要:1.背包九讲2.背包九讲详解转载 2019-04-21 19:40:11 · 223 阅读 · 0 评论 -
洛谷 P1616【疯狂的采药】
原题链接思路:完全背包裸题。题目中强调大数据,然而也并不需要做特殊的优化。代码:在这里插入代码片原创 2019-04-17 21:47:38 · 281 阅读 · 0 评论 -
HDOJ 3466【Proud Merchants】
WA代码:46MS 1488K#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int maxn = 505 ;const int maxw = 5005; int dp [maxw];int cost[maxw];s...原创 2019-04-18 21:50:16 · 156 阅读 · 0 评论 -
HDOJ 2159【Fate】
题目链接二维费用的背包问题,第二维费用即为数量。要仔细想想如何打背包,本题中只能是:dp[i][j] 这一格代表 最多花 i 忍耐度,最多打 j 个怪 的限制下,能够获得的最大经验值。另一种想法花给定的经验值获得最少的忍耐度的想法是行不通的,下文会讲。AC代码:c#include <iostream>#include <cstring>#include ...原创 2019-04-23 20:01:57 · 139 阅读 · 0 评论 -
洛谷 P1757【通天之分组背包】
题目链接思路:很简单的分组背包裸题,在做过AreYouBusy(pre blog)之后已经可以一遍过。每组选一,即AtMostOne问题。一组一组平推,每次用rec数组记录,属于做过一遍就不会忘的方法。注意转移方程不要写错,dp[ j ] 代表可能已经使用了本组中某物品之后得到的最大值,rec[ j - w[i] ] + v[ i ] 代表是第一次选本组中的物品。代码://16m...原创 2019-04-23 20:53:05 · 291 阅读 · 0 评论 -
HDOJ 1712【ACboy needs your help】
题目链接一题(一遍过的题),分组背包裸题,详见通天之分组背包(pre blog)。//296MS 1456K#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxn = 105;int n,W;int ...原创 2019-04-23 21:20:00 · 130 阅读 · 0 评论 -
HDOJ 3449【Consumer】
题目链接存疑:第一种代码为何WA?思路:注意题面没说多组用例,但是实际上是,很坑。依赖背包,即每组中的物品由一个主件和若干附件组成,若买任意附件则必须先买主件。本题中主件价值为零,价格倒是挺贵。首先按照背包九讲中的做法,不知为何WA:对每一组中的物品进行泛化(即先进行一次Sub_Pack,详见背包九讲)。对泛化后的物品进行Main_Pack。(均为01Pack)代码:WA:85...原创 2019-04-24 19:26:18 · 148 阅读 · 0 评论 -
洛谷 P1604【金明的预算方案】
题目链接一遍过题,甚是欣慰。依赖背包裸题。代码:54ms,928KB//54ms, 928KB #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxw = 32005;const int maxn...原创 2019-04-24 19:54:43 · 128 阅读 · 0 评论 -
【F - True Liars】
思路:带权并查集(种类)注意**par[i]和FIND(i)**的区别。dp+输出路径注意cur卡了很久最奇怪的就是maxn的大小,605、1005都会WA,1000、1111则AC。代码:63ms 4696kB//63ms 4696kB#include <iostream>#include <algorithm>#include &l...原创 2019-07-02 15:05:00 · 251 阅读 · 0 评论 -
【G - 免费馅饼】
思路:简单动态规划。两个维度:时间地点,这十分好想,但是先前几秒的位置限制(有些点走不到)十分让人迷惑。那么本题的关键就在倒序计算,如此许多问题迎刃而解。代码:62ms 7292kB//62ms 7292kB#include <iostream>#include <cstring>#include <algorithm>usi...原创 2019-07-12 22:27:03 · 151 阅读 · 0 评论 -
【H - Tickets】
思路:一般动态规划。注意输出格式,%02d,24小时制。代码:15ms 1424kB//15ms 1424kB#include <iostream>#include <algorithm> #include <cstring>using namespace std;const int maxn = 2005;int N...原创 2019-07-13 11:55:17 · 172 阅读 · 0 评论 -
【A - Max Sum Plus Plus】
思路:M子段最大和。动态规划拢共分三步:递推突破口:子段和类问题都是选新数字与不选新数字,选新数字又分为吸附与拓展。状态转移方程:先用正方形 dp 找出原始方程,然后根据条件(本题中是左段右段)找到变量边界,并且必不可少的是:方程中一定有端格是超限的,这时要手动解决。优化:空间开销一般可以缩小到很少的维数。代码:正方形dp:int sum[maxn];int L_...原创 2019-07-09 23:30:45 · 173 阅读 · 0 评论 -
【R - Milking Time】
思路:不是普通01背包吗?有两个问题:手推样例就可以发现,如果不对区间 sort,则裸的01背包无法得出正确结果。即使根据右端点排序后进行01背包,可能是对的,但是会 TLE。那么现在为了降低时间复杂度,将对每个点时间的 dp 变为对每个物品(区间)的 dp。又出现一个问题:dp[i] 应该代表 “ 必须使用 i 区间 ”,还是 “ 前 i 个区间可以得到的最优解 ” ?答案:...原创 2019-07-27 22:15:50 · 197 阅读 · 0 评论