LIS系列总结
此篇博客总结常见的LIS模型变形的解法。
-------------------------------------------------------------------
〇、LIS的$O(NlogN)$复杂度的dp和$O(N^2)$复杂度的dp就不写了。
一、最长不下降子序列
把$O(NlogN)$复杂度的dp中,查找$\ge a[i]$的函数lower_bound改为查找$> a[i]$的函数upper_bound即可。
#include<bits/stdc++.h>
using namespace std;
;
int n, a[MAXN], dp[MAXN];
int main(){
freopen("input.txt", "r", stdin);
freopen("output2.txt", "w", stdout);
while(~scanf("%d", &n)){
;i < n;++i)scanf("%d", a + i);
memset(dp, 0x3f, sizeof(dp));
;i < n;++i){
int p = upper_bound(dp, dp + n, a[i]) - dp;
dp[p] = a[i];
}
cout << (lower_bound(dp, dp + n, 0x3f3f3f3f) - dp) << endl;
}
;
}
二、LIS输出方案
1、输出任意方案(以下方法其实是输出下标字典序最大的一个LIS)
#include<bits/stdc++.h>
using namespace std;
;
int n, a[MAXN], dp[MAXN], par[MAXN];
map<int, int> mp;
void print(int x){
if(~par[x])print(par[x]);
printf("%d ", a[x]);
}
int main(){
freopen("input.txt", "r", stdin);
freopen("output2.txt", "w", stdout);
while(~scanf("%d", &n)){
;i < n;++i)scanf("%d", a + i);
memset(dp, 0x3f, sizeof(dp));
memset(par, -, sizeof(par));
mp.clear();
;i < n;++i){
int p = lower_bound(dp, dp + n, a[i]) - dp;
dp[p] = a[i];
mp[a[i]] = i;
)par[i] = mp[dp[p - ]];
}
int len = lower_bound(dp, dp + n, 0x3f3f3f3f) - dp;
printf("%d\n", len);
print(mp[dp[len - ]]);
printf("\n");
}
;
}
2、输出LIS下标字典序最小的方案
#include<bits/stdc++.h>
using namespace std;
;
int n, a[MAXN], dp[MAXN], par[MAXN];
map<int, int> mp;
vector<int> v[MAXN];
void print(int x, int y) {
) {
; i < v[x - ].size(); ++i) {
][i]] < a[v[x][y]]){
print(x - , i);
break;
}
}
}
printf("%d ", a[v[x][y]]);
}
int main() {
freopen("input.txt", "r", stdin);
freopen("output2.txt", "w", stdout);
while(~scanf("%d", &n)) {
; i < n; ++i)scanf("%d", a + i);
; i < n; ++i)v[i].clear();
memset(dp, 0x3f, sizeof(dp));
memset(par, -, sizeof(par));
mp.clear();
; i < n; ++i) {
int p = lower_bound(dp, dp + n, a[i]) - dp;
dp[p] = a[i];
mp[a[i]] = i;
)par[i] = mp[dp[p - ]];
v[p].push_back(i);
}
int len = lower_bound(dp, dp + n, 0x3f3f3f3f) - dp;
printf("%d\n", len);
print(len - , );
printf("\n\n");
}
;
}
3、输出数值字典序最小的方案
朴素的想法:在第2步的基础上,把所有方案找出来,然后比较数值字典序。
4、输出公差为$d$的LIS(此LIS不一定是最长上升子序列,但肯定是最长的上升的公差为$d$的等差数列)(任意一个即可)
例题:http://codeforces.com/contest/977/problem/F
/********************template head********************/
#include<bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mk(x, y) make_pair(x, y)
#define pln() putchar('\n')
#define cln() (cout << '\n')
#define fst first
#define snd second
#define MOD 1000000007LL
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
;
/********************template head********************/
int n, d, a[MAXN], dp[MAXN], par[MAXN], len;
map<int, int> mp;
void dfs(int x) {
if(~par[x])dfs(par[x]);
printf("%d ", a[x]);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("output2.txt", "w", stdout);
#endif // ONLINE_JUDGE
while(~scanf("%d%d", &n, &d)) {
; i < n; ++i)scanf("%d", a + i);
memset(par, -, sizeof(par));
mp.clear();
; i < n; ++i) {
map<int, int>::iterator it = mp.find(a[i] - d);
;
else {
dp[i] = dp[it->snd] + ;
par[i] = it->snd;
}
mp[a[i]] = i;
}
int p = max_element(dp, dp + n) - dp;
printf("%d\n", dp[p]);
dfs(p);
printf("\n");
}
;
}
LIS系列总结的更多相关文章
- 动态规划精讲(一)A单串
单串 单串 dp[i] 线性动态规划最简单的一类问题,输入是一个串,状态一般定义为 dp[i] := 考虑[0..i]上,原问题的解,其中 i 位置的处理,根据不同的问题,主要有两种方式: 第一种是 ...
- 小明系列问题――小明序列(LIS)
小明系列问题――小明序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- hdu4521 小明系列的问题——小明序列(LIS变种 (段树+单点更新解决方案))
链接: huangjing 题目:中文题目 思路: 1:这个题目假设去掉那个距离大于d的条件,那么必定是一个普通的LIS.可是加上那个条件后就变得复杂了.我用的线段树的解法. . .就是採用延迟更新的 ...
- hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- 小明系列问题——小明序列(Lis 相距大于d的单调上升子序列)
小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu_4521_小明系列问题——小明序列(LIS)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4521 题意:中文题,不解释 题解:这题就是LIS的加强版,可以用二分的nlogn来做,也可以用线段树的 ...
- querySelectorAll 方法相比 getElementsBy 系列方法区别
最近有人问到querySelectorAll 方法相比 getElementsBy 系列方法区别,一时没想起来说些什么,今天查下文档,总结一下它们的区别,以便自己理解. 1. W3C 标准queryS ...
- hdu----(4521)小明系列问题——小明序列
小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- 8.3 LIS LCS LCIS(完结了==!)
感觉这个专题真不好捉,伤心了,慢慢啃吧,孩纸 地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28195#overview 密码 ac ...
随机推荐
- UOJ #164 【清华集训2015】 V
题目链接:V 这道题由于是单点询问,所以异常好写. 注意到每种修改操作都可以用一个标记\((a,b)\)表示.标记\((a,b)\)的意义就是\(x= \max\{x+a,b\}\) 同时这种标记也是 ...
- TinyURL
2018-03-09 15:19:04 TinyURL,短地址,或者叫短链接,指的是一种互联网上的技术与服务.此服务可以提供一个非常短小的URL以代替原来的可能较长的URL,将长的URL地址缩短. 用 ...
- BeginInit与EndInit的实践总结
在项目中,遇到这种情况,总结随便如下: 初始化时:添加操作,BeginInit{flag=true} 警情是一条条加入的,全部都加入后,图表再一次性生成 EndInit{flag=false} ...
- DCOS(centos 7.4/7.6)
https://dcos.io/releases/ https://downloads.dcos.io/dcos/stable/1.12.0/dcos_generate_config.sh https ...
- 51nod-1420-贪心
1420 数袋鼠好有趣 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有n只袋鼠.每只袋鼠的大小用一个整数表示 ...
- Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api(二十)
一:Swagger介绍 Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目 实现了与SpingMVC框架的无缝集成功能,方便生成spring r ...
- MySQL根据表字段生成C#Model语句
USE INFORMATION_SCHEMA;SELECT CONCAT('/// <summary>\r\n/// ',COLUMN_COMMENT,'\r\n/// </summ ...
- 线程的同步之Synchronized在单例模式中的应用
synchronized在单例模式中的使用 在单例模式中有一种懒汉式的单例,就是类初始化的时候不创建对象.等第一次获取的时候再创建对象.这种单例在单线程下是没有问题的获取的也都是同一个对象.但是如果放 ...
- Howto: 在ArcGIS10中将地图文档(mxd文档)批量保存到之前版本
Howto: 在ArcGIS10中将地图文档(mxd文档)批量保存到之前版本 文章编号 : 38783 软件: ArcGIS - ArcEditor 10 ArcGIS - ArcInfo 10 A ...
- IE8下的typeof(console.log)为"object"的BUG
今天发现IE8在开启过控制台后,console.log虽然可用,也是确实是一个函数,但是对其执行typeof操作返回的确是"object" 原生IE8: