算法实践:最长上升子列
程序员文章站
2022-03-24 15:25:24
...
最长上升子列
描述
一个数的序列ai,当a1<a2<…<aS的时候,我们称这个序列是上升的。
对于给定的一个序列(a1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2,…, aiK),这里1<=i1<i2<…<iK<=N。
比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3, 5,8).
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
输入
输入的第一行是序列的长度N(1<=N<=1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
输出
最长上升子序列的长度。
样例
7
72 24 76 89 82 48 86
4
难度
中,动态规划填表
解法
代码
#include "bits/stdc++.h"
#include "vector"
#include "algorithm"
using namespace std;
int lengthOfLIS(int *nums,int n) {
if (n == 0) return 0;
int dp[n];
for (int i = 0; i < n; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (nums[j] < nums[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
int max = dp[0];
for(int i=1;i<n;i++){
if(dp[i]>max) max = dp[i];
}
return max;
// return *max_element(dp.begin(), dp.end());
}
int main()
{
int n;
cin>>n;
int nums[n];
for(int i = 0;i<n;i++)
cin >> nums[i];
cout<<lengthOfLIS(nums,n);
}