例:
LIS是最长上升子序列。什么是最长上升子序列? 就是给你一个序列,请你在其中求出一段最长严格上升的部分,它不一定要连续。
就像这样:2, 3, 4, 7 和 2, 3, 4, 6 就是序列 2 5 3 4 1 7 6 的两个上升子序列,最长的长度是 4。
用f[i]来记录位置为i时的最长上升子序列的个数,在判断i+1位(后一位),如果i+1位能组成,则取f[当前位]=max(f[当前位],f[前一位子序+1),代码如下:
#include<bits/stdc++.h>
using namespace std;
int f[10000], b[10000];
int max(int a, int b) {
return a > b ? a : b;
}
int lis(int n) {
memset(f, 0, sizeof f);
int res = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (b[j] < b[i]) {
f[i] =max(f[i],f[j]+1); }
}
res = max(res, f[i]);
}
return res+1;
}
int main() {
int n;
scanf("%d", &n);//7
for (int i = 0; i < n; ++i)
scanf("%d", b + i);//2 5 3 4 1 7 6
printf("%d\n", lis(n));
return 0;
}