牛客:最长不下降子序列

给定一个由
n
n 个正整数组成的数组
{
a
1
,
a
2
,

,
a
n
}
{a
1

,a
2

,…,a
n

}。请你计算该数组的最长不下降子序列(Longest Non-decreasing Subsequence,简称 LNDS)长度。
对于一条子序列,要求保留原数组中的相对顺序,并满足子序列中的元素依次不小于前一个元素,即
b
1

b
2



b
k
b
1

≦b
2

≦⋯≦b
k

【名词解释】


∙子序列:子序列为从原数组中删除任意个(可以为零、可以为全部)元素得到的新数组。


∙单调不降:单调不降是指对于数组
b
b 中从左向右数的第
i
i 个元素
b
i
b
i

,如果
b
i
+
1
b
i+1

存在,那么
b
i

b
i
+
1
b
i

≦b
i+1


输入描述:
第一行输入一个整数
n
(
1

n

5
×
1
0
3
)
n(1≦n≦5×10
3
),代表数组的元素数量。
第二行输入
n
n 个整数
a
1
,
a
2
,

,
a
n
(
1

a
i

1
0
6
)
a
1

,a
2

,…,a
n

(1≦a
i

≦10
6
),代表数组元素。
输出描述:
在一行上输出一个整数,表示最长不下降子序列的长度。

include

include

include

include

using namespace std;
using ll=long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
ll n;
cin>>n;
vectora(n);
for(ll i=0;i<n;i++)cin>>a[i];
vectordp(n,1);
ll ans=1;
for(ll i=0;i<n;i++)
{
for(ll j=0;j<i;j++)
{
if(a[j]<=a[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
ans=max(ans,dp[i]);
}
cout<<ans;

return 0;

}
// 64 位输出请用 printf("%lld")

posted @ 2026-04-22 21:57  lagranSun  阅读(4)  评论(0)    收藏  举报