最长上升子序列
给你一个长度为N的序列,求其最长上升子序列的长度。
样例输入:
6
1 6 2 4 3 5
样例输出:
4
解释:其最长上升子序列的长度为4。可以是{1 2 4 5 }或者{1 2 3 5}
注意:子序列是不连续的。
假设我们把序列储存在a数组中,并且从下标1开始存储。
动态规划解法
定义 f[i] 表示到 a[i] 为止的最长上升子序列的长度。(其中a[i]必须被选中,必须以a[i]结尾)
所以动态转移方程是 f [ i ] = max( f [ j ] ) + 1. ( 1 <= j < i 并且 a [ j ] > a [ i ] )
也就是说 对于位置i来说,只要前面的a[ j ]小于a[ i ],那么就可以转移过来,从中选择一个最大的即可。
代码:
#include<iostream>
using namespace std;
const int maxn=10000;
int a[maxn],f[maxn];
int main() {
int n;
cin>>n;
for (int i=1; i<=n; i++)
cin>>a[i];
for (int i=1; i<=n; i++