单调递增最长子序列LIS(两种解法)
来源:互联网 发布:日本公安知乎 编辑:程序博客网 时间:2024/06/04 19:55
一。第一种方法:从头开始遍历
#include<iostream>using namespace std;int main() { int T; while(cin >> T) { int a[1005]={0}, dp[1005]={0}, Max=0; for(int i = 0; i < T; i++) cin >> a[i]; for(int i = 0; i < T; i++) { dp[i]=1; for(int j = 0; j < i; j++) if(a[i]>a[j]) dp[i]=max(dp[j]+1, dp[i]); Max=max(Max, dp[i]); // cout << Max << endl; } cout << Max << endl; }}
二。使用二分查找,更新dp序列,使dp序列的每一位为当前可取的最小值
#include<iostream>using namespace std;int search(int dp[], int len, int x) { int l=1, r=len, midle=(l+r)/2; while(l<=r) { if(x==dp[midle]) return midle; else if(x>dp[midle]) l=midle+1; else r=midle-1; midle=(l+r)/2; } return l;}int main() { int T; while(cin >> T) { int a[100005]={0}, dp[100005]={0}; for(int i = 0; i < T; i++) cin >> a[i]; dp[1]=a[0]; int len=1, j; for(int i = 1; i < T; i++) { if(a[i]>dp[len]) dp[++len]=a[i]; j=search(dp, len, a[i]); dp[j]=a[i]; if(j>len) len=j; } cout << len << endl; }}
阅读全文
0 0
- 单调递增最长子序列LIS(两种解法)
- 单调递增最长子序列(Lis)
- 最长单调递增子序列(LIS)
- 最长递增子序列(LIS)的两种实现
- 最长单调递增子序列-LIS问题
- 最长单调递增子序列LIS
- 单调递增最长子序列(LIS)
- NYOJ-单调递增最长子序列(两种算法)
- nyoj 单调递增最长子序列 17 (LIS模板)
- nyoj 17 单调递增最长子序列 (LIS)
- NYOJ 17 单调递增最长子序列 (LIS模板)
- 单调递增最长子序列(LIS)【NY】-17
- 最长单调递增子序列的三种解法
- 最长单调递增子序列的三种解法
- 单调递增最长子序列(LIS)&&最长公共子序列(LCS)
- NYOJ - 17 - 单调递增最长子序列(动态规划--LIS--单调递增最长子序列)
- 单调递增子序列LIS (DP)
- nyoj 17 单调递增最长子序列 【LIS】
- 欢迎使用CSDN-markdown编辑器
- hdu1213(基础并查集)
- 字符缓冲输入流的创建
- 堆排序:最大堆与最小堆
- Java基本程序设计结构 入门-简单Java应用
- 单调递增最长子序列LIS(两种解法)
- linux文件系统 EXT2-EXT3的区别
- C语言--struct和union
- JSP内置对象
- priority_queue
- java.net.SocketException: Permission denied解决方案
- 453. Minimum Moves to Equal Array Elements
- 4、python web方向Django新手入门—MYSQL数据库操作篇
- git场景使用