最大子序列和·动态规划分析

这篇博客分析了如何使用动态规划求解给定序列的最大子序列和问题。通过定义D[N]和d[N],阐述了当AN大于等于0和小于0时的情况,并推导出状态转移方程D[N]=Max(D[N−1],Max(AN,{d[N−1],AN})),为编写实现代码奠定了基础。" 97618294,8259274,原生JS创建文字滚动特效,"['前端开发', 'JavaScript']

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

最大子序列和·动态规划分析

题目

给定序列{A1,A2,A3,...,AN}\{A_1,A_2,A_3,...,A_N\}{A1,A2,A3,...,AN},求该序列的最大子序列和对应的序列

分析

以下将最大子序列和对应的序列简称为最大子序列

设D[N]是序列的最大子序列,设d[N]是序列中必须含有ANA_NAN并以ANA_NAN结尾的最大子序列

例:{-1,3,4,-2,7,-20}。D[4]={3, 4},d[4]={3,4,-2}

由D[N]是否含有ANA_NAN可得
{D[N]=d[N],AN≥0(此时D[N]含有AN)D[N]=D[N−1],AN<0(此时D[N]不含有AN)(1) \left\{\begin{array}{ll} D[N]=d[N],&A_N\ge 0(此时D[N]含有A_N) \\ D[N]=D[N-1],&A_N< 0(此时D[N]不含有A_N) \end{array}\right. \tag 1 {D[N]=d[N],D[N]=D[N1],AN0D[N]AN)AN<0D[N]AN)(1)
(1)式可化简为(2)
D[N]=Max(D[N−1],d[N])(2) D[N]=Max(D[N-1],d[N]) \tag 2 D[N]=Max(D[N1],d[N])(2)
其中Max()是比较两个序列的和并返回最大序列和对应序列的方程

d[N]分析

d[N]是以ANA_NAN结尾的最大子序列,若d[N-1]的序列和为负数则d[N-1]不可能为d[N]的一部分,由此可得
{d[N]={d[N−1],AN},Sum(d[N−1])≥0d[N]=AN,Sum(d[N−1])<0(3) \left \{ \begin{array}{ll} d[N]=\{d[N-1],A_N\},&Sum(d[N-1])\ge 0 \\ d[N]=A_N,&Sum(d[N-1])< 0 \end{array} \right. \tag 3 {d[N]={d[N1],AN},d[N]=AN,Sum(d[N1])0Sum(d[N1])<0(3)
其中Sum()为计算序列和的函数

(3)式可化简为(4)
d[N]=Max(AN,{d[N−1],AN})(4) d[N]=Max(A_N,\{d[N-1],A_N\}) \tag 4 d[N]=Max(AN,{d[N1],AN})(4)
结合(2)(4)可得
D[N]=Max(D[N−1],Max(AN,{d[N−1],AN}))(5) D[N]=Max(D[N-1],Max(A_N,\{d[N-1],A_N\})) \tag 5 D[N]=Max(D[N1],Max(AN,{d[N1],AN}))(5)
此时状态D[N]只与上一级状态D[N-1],d[N-1],本级参数ANA_NAN相关,所以(5)是最大子序列的状态转移方程

有了状态转移方程再去编写实现代码就是很简单的事了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值