[LIS]Longest Increasing Sequence:nlogn算法和两种普通DP的实现
2013-07-26 17:00
483 查看
//最长单调上升子序列 nlogn算法 #include<iostream> using namespace std; #define MAXN 40002 int a[MAXN],d[MAXN]; int main() { int n; cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; int len=1; d[1] = a[1]; for(int i=2; i<=n; i++) { if(d[len]<a[i]) { d[++len] = a[i]; continue; } int l=1,r=len,mid; while(l<=r) { mid = (l+r)/2; if(d[mid]<a[i]) l = mid+1; else r = mid-1; } d[l] = a[i];//相等的时候 r左移 故退出时可选l或mid } cout<<len<<endl; return 0; } //那么DP应该怎么写呢? //这样写是找都哪些可以接在a[i]后面,可以的话,取max更新;不可以的话不变 #include<iostream> #include<cstring> using namespace std; #define MAXN 1005 int a[MAXN],dp[MAXN]; int main() { int n; cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; int i,j; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) dp[i] = 1; for(i=1; i<=n; i++) for(j=i+1; j<=n; j++)//j铺路,i断后;j { if(a[j]>a[i]) { dp[j] = max(dp[i] + 1,dp[j]); //cout<<"dp["<<j<<"] = "<<dp[j]<<endl; } } int m = dp[1]; for(i=2;i<=n;i++) if(dp[i]>m) m = dp[i]; cout<<m<<endl; return 0; } //还有一种是看前面那些可以插入a[j] #include<iostream> #include<cstring> using namespace std; #define MAXN 1005 int a[MAXN],dp[MAXN]; int main() { int n; cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) dp[i] = 1; for(int i=1;i<=n;i++) for(int j=1;j<i;j++) { if(a[j]<a[i]) dp[i] = max(dp[i],dp[j]+1); } int m = 1; for(int i=1;i<=n;i++) if(dp[i]>m) m = dp[i]; cout<<m<<endl; return 0; }
相关文章推荐
- Longest Increasing Subsequences(最长递增子序列)的两种DP实现
- DP-LIS( Longest Increasing Subsequenc)
- Longest increasing substring (LIS)--DP
- Find longest increasing sequence (LIS)
- 最长上升子序列 LIS(Longest Increasing Subsequence)---DP
- DP中的LIS:longest increasing subsequence
- DP(dynamic programming)之LIS(longest increasing subsequence)问题(转)
- Longest Increasing Subsequence (LIS) 的java实现
- 最长不降子序列/longest increasing sequence(LIS) O(n*lgn) POJ3670
- leetcode 329 : Longest Increasing Path in a Matrix : dfs+dp
- longestIncreasingSequence最长上升子序列问题
- 最长上升子序列 LIS(Longest Increasing Subsequence)
- Dynamic Programming之Longest Increasing Subsequence (LIS)问题
- 普通快速排序的两种实现
- 【DP|LIS】POJ-2533 Longest Ordered Subsequence(O(n^2)、O(nlogn))
- 最长上升子序列 LIS (Longest Increasing Subsequence)
- Longest Continuance Increasing sub-sequence in matrix
- 【二维dp_右下递推】interleaving、Distinct Subsequences、字符串交错、min edit distance、longest common sequence(LCS)
- 【CodeForces 5C】【贪心】【dp】Longest Regular Bracket Sequence
- 最长不降子序列 LIS(Longest Increasing Subsequence) 动态规划与深度搜索