最长上升子串
2014-10-31 16:34
176 查看
最长上升字串:
介绍一个n*logn的解法:使用二分,代码简短:根据dp,dp[i] 表示:长度为i+1的上升子序列中末尾元素的最小值,默认表示的INF,若出现比当前还小的元素,则进行更新操作,dp数列除了INF都是单调递增的,所以对于每次操作,需要更新的位置则不需要全都遍历,只需要使用二分搜索进行判断,时间复杂度为nlogn。
#include <iostream> #include <algorithm> using namespace std; const int MAX = 100; int dp[MAX]; int a[MAX]; int n; const int INF = 1<<30; void slove(){ //lower_bound:表示返回指向a[i]的最小指针位置,不存在就返回第一个不小于a[i]的元素位置 fill(dp,dp+n,INF); for(int i=0;i<n;i++) *lower_bound(dp,dp+n,a[i]) = a[i]; cout<<(lower_bound(dp,dp+n,INF)-dp)<<endl; } int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; slove(); return 0; }
使用了lower_bound算法。
#include <iostream> using namespace std; const int MAX = 100; int dp[MAX]; int a[MAX]; int n; int search(int num,int low,int high){ int mid; while(low<=high){ mid = low+((high-low)>>1);//(low+high)/2; if(num>=dp[mid]) low = mid+1; else high = mid-1; } return low; } int DP(){ int len=0,pos; dp[0]=a[0]; for(int i=1;i<n;i++){ if(a[i]>=dp[len]){ len = len+1; dp[len] = a[i]; }else{ pos = search(a[i],0,len); dp[pos] = a[i]; } } cout<<len+1<<endl; return len+1; } int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; DP(); return 0; }同样的实现,代码相对复杂。
相关文章推荐
- “最长上升子序列,最大连续子序列和,最长公共子串”的Java实现
- poj 2533 LIS(最长上升子串)入门
- “最长上升子序列,最大连续子序列和,最长公共子串”的Java实现
- hdu 4512 吉哥系列故事——完美队形I(最长上升公共子串)
- 繁华模拟赛 最长上升子串
- [noip测试]最长上升子串(乱搞||dp)
- poj2533(最长上升子串)
- 左神算法 最长公共子串 最长上升子序列
- 最长上升子串
- HDU 1025 Constructing Roads In JGShining's Kingdom 最长上升子串
- ju 2432Greatest Common Increasing Subsequence 最长公共上升子串-dp
- 最大连续子序列和,最大上升子序列和,最长上升子序列,最长公共子串,最长公共子序列,最长上升公共子序列
- 最长公共子序列、最长上升子序列、最大子串和
- 最长公共子序列、上升子序列、最长上升子序列、最长公共子串
- 经典字符串算法 “最长上升子序列,最大连续子序列和,最长公共子串”
- HDU 3525 Orienteering (最长公共子串转化为最长上升子序列)
- hdu 1025 Constructing Roads In JGShining's Kingdom--最长上升子串(时间优化)
- HDU 3525 Orienteering (最长公共子串转化为最长上升子序列)
- (Relax DP1.5)POJ 1458 Common Subsequence(使用dp来求解最长公共子串)
- 找出字符串最长不重复子串,输出长度