
(子类)序列与串
Masker_43
这个作者很懒,什么都没留下…
展开
-
【A - Max Sum Plus Plus】
思路: M子段最大和。 动态规划拢共分三步: 递推突破口:子段和类问题都是选新数字与不选新数字,选新数字又分为吸附与拓展。 状态转移方程:先用正方形 dp 找出原始方程,然后根据条件(本题中是左段右段)找到变量边界,并且必不可少的是:方程中一定有端格是超限的,这时要手动解决。 优化:空间开销一般可以缩小到很少的维数。 代码: 正方形dp: int sum[maxn]; int L_...原创 2019-07-09 23:30:45 · 179 阅读 · 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 · 102 阅读 · 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 · 95 阅读 · 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 · 659 阅读 · 0 评论 -
【Q - Phalanx】
思路: 最大对称子矩阵,一开始就有些思路,搜了下题解发现差不多就直接动手写了,A的好开心。 算是枚举吧,其实大部分 dp 都是优化的枚举嘛,本题略有看表填格的影子。 dp[i][j] 代表以 mp[i][j] 为左下对角元的最长对称矩阵边长。写法要注意,本代码写的稍微有一点点取巧。 代码: 2964ms 6344kB //2964ms 6344kB #include <io...原创 2019-07-23 23:47:54 · 365 阅读 · 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 · 171 阅读 · 0 评论 -
【C - Monkey and Banana】
思路: 最长上升子序列的变种。 数字改成了结构体 BLOCK,并且不仅要求出长度,本题需要求出最高的高度。 每个 BLOCK 都是无限的,因此每块都可以变成六块。然后按底面的长排序(贪心),正方形 dp 求解。 注意 ans 的使用(dp[i] 的意义)。 代码: 核心:正方形 dp 求解最长上升子序列 #include <iostream> #include <algo...原创 2019-07-10 16:37:37 · 233 阅读 · 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 · 145 阅读 · 0 评论 -
【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 · 143 阅读 · 0 评论 -
【I - 最少拦截系统】
思路: 一: 这是一道经典的动归题目,经典在它可以牵引出 Dilworth定理、LIS(Longest Increasing Subsequence)。 先说 Dilworth:Dilworth定理包含如下知识:偏序集、链、反链。Dilworth 包括两个对偶定理: 最大链长度 = 最少反链划分数。 最大反链长度 = 最少链划分数。 那如何使用该定理呢?非常简单。以本题为例:求最少...原创 2019-07-14 13:41:52 · 167 阅读 · 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 · 116 阅读 · 0 评论