给定一个数组,我们要在里面找出他的一个递增子序列,求出这些子序列中最长的长度
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#define NUM 100
using namespace std;
int LIS(int a[], int n){
int b[NUM] = {0}; // 辅助数组,用来储存最长单调递增子序列的长度
int i, j;
b[0] = 1;
int max = 0;
// 大体上是从前往后,子问题上是从后往前
for(i = 1;i < n;i++){ // 先解决i之前的子问题
int k = 0;
for(j = 0;j < i;j++){ // j从0开始到i
if(a[j] <= a[i] && k < b[j]) // 如果后面的小于前面的,而且子问题的答案大于前一个,就更新k
k = b[j]; // k就是前一个子问题的答案 k = b[j-1],这里一直在找前 i - 1个序列的最大答案
}
b[i] = k + 1; // 一开始k = 0,1是加上自己的这一长度
if(max < b[i])
max = b[i];
}
return max;
}
int main(){
int n = 8;
int a[n] = {65, 158, 170, 155, 239, 300, 207, 389};
cout << LIS(a, n);
}