最长上升子序列简介
题目描述
现有数列a1,a2,a3……aN。在其中找到严格递增序列ai1,ai2,ai3,……aiK(1 <= i1 < i2 < i3 < …… < iK <= N),请找出序列a的最长上升子序列的长度,既K的最大值。
输入格式
第一行:一个整数N。
第二行:N个整数a1,a2,a3……aN。
输出格式
一行,最大的K。
输入样例
10
5 10 8 9 7 10 13 12 25 13
输出样例
6
二维动态规划解法
提到DP,就一定就要去想:状态、转移方程、初值和答案了。
- 状态:dp[i]指在1~i这i个数中,必须包含a[i]这个数的最长上升子序列。
- 转移方程:if(a[j] < a[i]) dp[i] = max(dp[i], dp[j] + 1)(1 <= j <= i - 1)
其实这个的意思就是:如果说在1~(i - 1)这(i - 1)个数中,a[j] < a[i],a[i]就可以接上a[j],形成一个比dp[j]又多了1的递增序列,因此每次判断并取最大值就行了。 - 初值:dp[i] = 1(一个数本身就是一个递增序列)。
- 答案:max{dp[i]}
(PS:NR指序列长度的上限)
# include <cstdio>
# include <iostream>
# include <cmath>
# include <cstring>
# include <algorithm>
using namespace std;
# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)
const int NR = 100000;