侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【题解】求最长不下降序列

Allen Best
2023-10-10 / 0 评论 / 0 点赞 / 45 阅读 / 501 字
温馨提示:
本文最后更新于 2023-10-10,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

状态定义:
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;
}

0

评论区