今天给大家讲最长上升子序列这道题
话不多说 先上题目
题目描述
对于给定的一个序列,我们可以得到一些上升的子序列,这里。比如,对于序列(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
1 7 3 5 9 4 8
样例输出
4
这道题是一个很经典的线型DP问题
我们设f[i]表示以第i个数为末尾的最长公共子序列
则我们可以轻易推出
f
[
i
]
=
m
a
x
(
f
[
i
]
,
f
[
j
]
+
1
)
f[i]=max(f[i],f[j]+1)
f[i]=max(f[i],f[j]+1)
j就是在i以内的一个数
讲完了思路 我们就上代码
#include<bits/stdc++.h>
using namespace std;
int n,a[1005],dp[1005],x=-9999;
int main()
{
cin>>n;
dp[1]=1;
for(int i=1;i<=n;++i)
{
cin>>a[i];
dp[i]=1;
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<i;++j)
{
if(a[i]>a[j])
dp[i]=max(dp[i],dp[j]+1);
}
}
for(int i=1;i<=n;++i)
{
if(x<dp[i])
x=dp[i];
}
cout<<x;
}