【LIS 模板】
来源:互联网 发布:韩进海运破产原因知乎 编辑:程序博客网 时间:2024/06/05 10:17
1、复杂度0(n^2):
定义dp[i]:以ai为结尾的最长上升子序列的长度
以ai结尾的上升子序列是:①只包含ai的子序列
②在满足j<i并且aj<ai的以aj为结尾的上升子列末尾,追加上ai后得到的子序列
综合以上两种情况,便可以得到递推关系式:
dp[i] = max{1, dp[j]+1| j<i且aj<ai}
代码实现:
//O(n^2)#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 30010;int dp[maxn], a[maxn];int main(){int n;while(scanf("%d",&n)!=EOF){for(int i=0;i<n;++i) scanf("%d",&a[i]); int ans=0; for(int i=0;i<n;++i) { dp[i]=1; for(int j=0;j<i;++j) { if(a[j]<a[i]) dp[i] = max(dp[i], dp[j]+1); } ans=max(dp[i],ans); } printf("%d\n",ans); }return 0;}
2、复杂度0(nlogn):
定义dp[i]:长度为i+1的上升子序列中末尾元素的最小值(不存在就是INF)
最开始全部dp[i]的值都初始化为INF。然后由前到后逐个考虑数列的元素,对于每个aj,如果i=0或者dp[i-1]<aj的话,就用dp[i]=min(dp[i],aj)进行更新。最终找出使得dp[i]<INF的最大的i+1就是结果了。
代码实现:
//O(nlogn)#include <cstdio> #include <algorithm> #define INF 0x3f3f3f using namespace std; int dp[30010],a[30010]; int main() { int n,i,j; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;++i) { scanf("%d",&a[i]); dp[i]=INF; } for(i=0;i<n;++i) *lower_bound(dp,dp+n,a[i])=a[i]; printf("%d\n",lower_bound(dp,dp+n,INF)-dp); } return 0; }
阅读全文
0 0
- LIS模板
- 【LIS 模板】
- LIS模板
- Lis模板
- POJ 2533 LIS模板
- hdu1257 LIS模板题*
- POJ2533 LIS模板题
- LIS 的模板
- LCS,LIS等模板
- LCS,LCIS,LIS模板
- LIS模板O(nlogn)
- LIS nlogn 模板
- 【LIS】【模板】nlogn算法
- LIS+路径输出 模板
- 【模板】nlogn的LIS
- usaco 4.3(经典LIS模板)
- LCS/LIS/LCIS 模板总结
- LIS+输出路径模板(1160)
- 隐藏tomcat页面异常显示的版本信息
- ==和equals的区别
- MySQL初始化配置
- 从源码角度深度理解Mybatis的缓存特性
- cocoapods安装与报错处理
- 【LIS 模板】
- Ubuntu安装并开启SSH
- 搜索引擎索引的数据结构和算法
- 超文本传输协议
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
- [linux] nonseekable_open()
- K-均值算法 (K-Means Algorithm)
- ArcGIS Server 10.2 安装与破解图文教程
- Merge Join vs. Hash Join vs. Nested Loop