学习目标:
No.10线性DP
学习内容:
最长上升子序列问题:
输入7个数字 :3 1 2 1 8 5 6.则该序列的最长上升子序列为{1, 2,5,6}
DP:
其中,f[5]表示的意思是以5为下表的数作为结尾的上升子序列。第五个数是8,则子序列有8 18 28 18 128 38.
我们把第i个数确定,以i - 1作为分类点。若a[i - 1] < a[i] 所以长度为f[i - 1] + 1.
DP模板:
#include <iostream>
#include <algorithm>
using namespace std;
int n;
const int N = 1010;
int a[N], f[N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++ )
{
f[i] = 1;//序列只有一个数
for(int j = 1; j < i; j ++ )
if(a[j] < a[i])
f[i] = max(f[i], f[j] + 1);
}
int res = 0;
for(int i = 1; i <= n; i ++ ) res = max(res, f[i]);
printf("%d", res);
}