单调递增最长子序列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;  }}


原创粉丝点击