最长上升子序列
题目
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
第一行包含整数 N
第二行包含 N 个整数,表示完整序列。
介绍
。f[i]
代表的就是以i为结尾的最长上升子序列的长度,每遍历到一个数i的时候就要遍历j(从1到i-1的数),如果
a[i] > a[j]
说明可以组成上升子序列,然后
dp[i]=max(dp[i], dp[j] + 1)
- 注意一开始要将dp[i]初始为1,只有自己本身的长度。
源代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N], a[N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
for (int i = 1; i <= n; i ++ )
{
dp[i] = 1;
for (int j = 1; j < i; j ++ )
{
if (a[i] > a[j]) dp[i] = max(dp[i], dp[j] + 1);
}
}
int res = 0;
for (int i = 1; i <= n; i ++ ) res = max(res, dp[i]);
cout << res << endl;
return 0;
}
版权声明:
作者:徐锦桐
链接:https://www.xujintong.com/2023/03/12/104/
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者:徐锦桐
链接:https://www.xujintong.com/2023/03/12/104/
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
THE END