动态规划--最长不下降子序列

该博客主要讨论了如何解决最长不下降子序列的问题,这是一个经典的动态规划问题。作者指出,这可以看作是最长上升子序列问题的变种,只需要将比较条件从严格上升改为非严格上升即可。代码示例中给出了C++实现,通过双层循环更新动态规划数组f[],最终找到序列中最大不下降序列的长度。博客强调了理解问题本质和正确修改状态转移方程的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

设有整数序列b1,b2,b3,……,bm, 若存在i1< i2 <i3 <…… <in,且bi1<bi2<bi3……<bin, 则称b1,b2,b3,……,bn,中有长度为N的不下降序列bi1,bi2,bi3,……,bin。求序列b1,b2,b3,……,bm中最大不下降序列的长度。

输入格式

第一行为n,第二行为用空格隔开的n个整数。

输出格式

第一行为输出最大个数max。
输入输出样例
输入 #1

14
13 7 9 16 38 24 37 18 44 19 21 22 63 15

输出 #1

8

思路

最长上升子序列改版,只需做一个小小的改动。

易错点

上升≠不下降
上升是只能越来越大,而不下降是既可以上升,也可以相等
所以上最长上升子序列的状态转移方程:

if(num[j]<num[i]) f[i]=max(f[i],f[j]+1);

要变为:

if(num[j]<=num[i]) f[i]=max(f[i],f[j]+1);
就这么简单,其余照搬。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值