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 ...
随机推荐
- UVa 11889 最小公倍数
https://vjudge.net/problem/UVA-11889 题意: 输入两个整数A和C,求最小的整数B使得lcm(A,B)=C. 思路: 首先C是A的公倍数,如果C%A不为0肯定是无解的 ...
- Combobox绑定泛型字典时提示“复杂的 DataBinding 接受 IList 或 IListSource 作为数据源”的解决方法
一般情况下我们会将 DataTable 或 DataView 绑定到 Combobox 控件上,这时候进行数据绑定是没有问题的,因为DataTable 和 DataView 都继承了 IList 接口 ...
- poj 2828 Buy Tickets 树状数组
Buy Tickets Description Railway tickets were difficult to buy around the Lunar New Year in China, so ...
- install ros-indigo-filters
CMake Warning at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake: (find_package): Could not fi ...
- python json与字典对象互相转换
改文章转自:https://www.cnblogs.com/Lin-Yi/p/7640147.html 1 import requests 2 import json 3 ''' 4 json.loa ...
- Rails-Treasure chest3 嵌套表单; Ransack(3900✨)用于模糊查询, ranked-model(800🌟)自订列表顺序; PaperTrail(5000✨)跟踪model's data,auditing and versioning.
自订列表顺序, gem 'ranked-model' 多步骤表单 显示资料验证错误讯息 资料筛选和搜寻, gem 'ransack' (3900✨); 软删除和版本控制 数据汇出(csv), 自订列表 ...
- PrestaShop 1.7 订单生成后下载服务器出现 505 的错误
PrestaShop 生成订单后下载,服务器上有 505 的错误. 经查看应该是服务器上的错误: Allowed memory size of 134217728 bytes exhausted (t ...
- torchnet+VGG16计算patch之间相似度
torchnet+VGG16计算patch之间相似度 torch VGG16 similarity 本来打算使用VGG实现siamese CNN的,但是没想明白怎么使用torchnet对模型进行微调. ...
- IOS-如何优雅地拦截按钮事件(判断是否需要登录)
关于这个标题,起因是这样的. 最近一次做项目需求时,遇到这样一个需求,就是本来我们App是必须注册或者第三方登录才可以使用,现在希望不登录也可以浏览App里面的内容,只是在需要的时候才提示登录,并且在 ...
- Centos系统更改yum源为163
Centos安装好之后,按照网上教程对yum源进行修改,但更新之后发现总是提示更新失败,到163网站上查找资源发现目前大部分网上的教程都写错地址了,呵呵 下面是正确的办法,请参考 1.进入存放源配置的 ...