【题目描述】
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
【输入格式】
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
【输出格式】
输出一个整数,表示最大长度。
【解题思想】
求最长子序列的长度,可以将所有以a[i]为结尾的子序列的长度求出来用 f[i] 保存
序列中最后一个元素为a[i],那么倒数第二个元素a[j] 就需要小于a[i]
而此时以倒数第二个元素为结尾的子序列长度为f[j]
如果上述a[j] < a[i] 那么将f[i] 更新为f[i] 与 f[j] + 1 (+1是因为还有最后一个元素)
最后在所有的f[i] 中取最大的f[i] 即为题目所求的最长子序列的长度
【解题代码】
#include <iostream>
using namespace std;
int n;
const int N = 1010;
int f[N]; // f[i]表示以a[i]为结尾的最长子序列的长度
int res;
int a[N]; // a[i]表示每个元素的值
int main()
{
cin >> n;
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = 1;i <= n;i++)
{
f[i] = 1;
for(int j = 1;j < i;j++) //此处将a[j]当为子序列的倒数第二个元素的值
if(a[i] > a[j]) //要求递增,只有当最后一个元素的值大于倒数第二个元素的值才会成立
f[i] = max(f[i],f[j] + 1); //成立的话,长度取原来的值与f[j] + 1的较大值
res = max(res,f[i]); //每个f[i]的长度都计算出来之后取最长长度
}
printf("%d",res);
}