最长上升子序列Longest Increasing Subsequence
#include <bits/stdc++.h>
using namespace std;
int lis(int a[],int n){
int d[7],len=1; //定义DP数组,当前最长串长度,这里LEN是真正能形成的长度+1
d[0]=0; //DPI表示能够形成的长为I的LIS的末位字符,DP0就是0第0位形成字符就是0
for(int i=1;i<n;i++)//扫一次全部位即可,这里的I是数列的下标,不是DP的下标,DP的下标是LEN
if(a[i]>d[len-1]) d[len++]=a[i]; //如果第I位值比已经形成的长为LEN-1的值大则LEN可+1并记下AI
else d[lower_bound(d,d+len,a[i])-d]=a[i]; //否则就二分(肯定是升序的)找到该合适位置赋AI
return len;//因为题目默认每个数都是不同的,所以没有考虑等于的情况
}
int main(){
int a[7]={1,5,3,4,6,2,7};
cout<<lis(a,7)<<endl;
return 0;
}
/*
例如
1 5 3 4 6 2 7
d[]
1
1 5
1 3
1 3 4
1 3 4 6
1 2 4 6
1 2 4 6 7
输出5
若要记录路径就多开path
*/