最大子序列和·动态规划分析
题目
给定序列{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[N−1],AN≥0(此时D[N]含有AN)AN<0(此时D[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[N−1],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[N−1],AN},d[N]=AN,Sum(d[N−1])≥0Sum(d[N−1])<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[N−1],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[N−1],Max(AN,{d[N−1],AN}))(5)
此时状态D[N]只与上一级状态D[N-1],d[N-1],本级参数ANA_NAN相关,所以(5)是最大子序列的状态转移方程
有了状态转移方程再去编写实现代码就是很简单的事了