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