状态定义:
dp[i]:以第i元素为结尾的不降子序列的长度。
记a[i]为第i个元素。
分割集合:以第i元素为结尾的不降子序列构成的集合。
子集1:对所有满足j < i的j, 如果a[i] >= a[j],则以第j元素为结尾的不降子序列加上第i元素,形成新的不降子序列。
子集2:否则,只有一个a[i]构成不降子序列。
#include<bits/stdc++.h>
using namespace std;
int n,a[1001],f[1001];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
f[i]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(a[j]<a[i])
f[i]=max(f[i],f[j]+1);
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,f[i]);
printf("%d\n",ans);
return 0;
}
评论区