给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤1000
−10e9≤数列中的数≤10e9
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
思路:
状态表示:f[i]表示从第一个数字开始算,以w[i]结尾的最大的上升序列。(以nums[i]结尾的所有上升序列中属性为最大值的那一个)
状态计算(集合划分):j∈(0,1,2,..,i-1), 在nums[i] > nums[j]时,dp[i] = max(dp[i], dp[j] + 1)。
有一个边界,若前面没有比i小的,dp[i]为1(自己为结尾)。
最后在找f[i]的最大值。
#include <iostream>
using namespace std;
const int N = 1e3 + 10;
int dp[N];
int n, nums[N], res;
int main() {
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> nums[i];
for (int i = 0; i < n; i ++ ){
dp[i] = 1;
for (int j = 0; j < i; j ++ )
if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
}
for (int i = 0; i < n; i ++ ) res = max(res, dp[i]);
cout << res;
}