UVa1471】的更多相关文章

这是LIS的变形,题意是求一个序列中去掉某个连续的序列后,能得到的最长连续递增序列的长度. 用DP的解法是:吧这个序列用数组a来记录,再分别用两个数组f记录以i结尾的最长连续递增序列的长度,g[i]记录以i开头的最长连续递增序列.然后像求DP求LIS一样遍历整个序列求出i前面所有小于a[i]的元素中以该元素结尾的最长序列f[j], 那么 dp[i] = g[j] + f[i], 这样时间复杂度为O(n^2). 由于和普通的LIS类似,所以可以利用LIS的优化方法把该题的时间复杂的优化到O(nlo…
此题紫书上面有详细分析,关键是运用Set优化实现O(nlgn)复杂度 AC代码: #include<cstdio> #include<set> #include<algorithm> using namespace std; const int maxn = 2e5+5; int num[maxn], h[maxn], g[maxn]; //g[i] - num[i] is the Last //h[i] - num[i] is the First struct nod…
题意:给你一串长度为n的序列   你的任务是删除一个连续的子序列  使得剩下的序列中有一个长度最大的连续递增子序列  例如  将 5 3 4 9 2 8 6 7 1 中的9 2 8 删除  得到5 3 4 6 7 1 中包含一个长度为四的连续子序列 紫书的分析十分好   从n3 到n2 到nlongn 非常精妙   此题细节很多  非常值得学习!!!  注意优先队列的写法. #include<bits/stdc++.h> using namespace std; #define N 20000…
最大上升子序列解法: 1.动规转移方程 2.(nlogn) #include<cstdio> #include<algorithm> using namespace std; <<; ]; ]; int main() { int n; while(~scanf("%d",&n)) { ;i<n;i++) scanf("%d",&a[i]); ;i<n;i++) f[i]=INF; ;i<n;i++…
保留有价值的数字的做法,实际上这道题因为n只有1e5,所以不需要这种优化. #include<bits/stdc++.h> #define inf 0x3f3f3f3f ; using namespace std; int t; int n; struct node{ int val; int dpl,dpr; bool operator < (const node &rhs) const{ if(val == rhs.val) return dpl < rhs.dpl;…
https://vjudge.net/problem/UVA-1471 题意:给出一个序列,删除一个连续子序列,使得剩下的序列中有一个长度最大的连续递增子序列,输出个数. 思路:首先可以计算出以i结尾的最大连续递增子序列个数 f(i) 和以i开头的最大连续递增子序列 g(i).之后就是动态规划吧,题目挺抽象,不太好解释,具体看代码吧. #include<iostream> #include<algorithm> using namespace std; * + ; int n; i…
[UVa1471] Defense Lines 算法入门经典第8章8-8 (P242) 题目大意:将一个序列删去一个连续子序列,问最长的严格上升子序列 (N<=200000) 试题分析:算法1:直接暴力,对于一个删除序列,枚举头和尾,然后看最长上升子序列.时间复杂度:O(N^3) 算法2:L[i]表示以i为结尾的最长严格上升子序列长度,R[i]表示以i为开头的最长严格上升子序列长度. 预处理:O(N)  然后依旧是枚举头和尾,那么答案就是L[i]+R[j]了.时间复杂度:O(N^2) 算法3:第…