动态DP教程
Ŀ¼ 最后一届NOIP TG的day2T3对于动态DP的普及起到了巨大的作用。 然而我到现在还不会 SP1716 GSS3 - Can you answer these queries III 题解位置 这道题的题目大意就是维护动态序列最大子段和。一个比较显然的想法就是用线段树维护 \(lmax,rmax,sum,max\) 即可。但是我们不想放弃DP的优良性质,于是就有了优良的动态DP。 对于这道题目,如果不考虑修改操作,那么DP就是这样的: 令 \(F[i]\) 表示以 \(A[i]\) 为结尾的最大子段和, \(G[i]\) 表示到 \(i\) 为止的答案,那么不难发现 \[ F[i]=A[i]+\max\{F[i-1],0\}\\ G[i]=\max\{G[i-1],F[i]\} \] 下一步就是把转移改写为矩乘的形式。能够改写是因为矩乘基于乘法对加法的分配律。而max同样对加法有分配律。也就是说: \[ a(b+c)=ab+ac\\ a+\max\{b,c\}=\max\{a+b,a+c\} \] 这样,上面的Dp就可以变成这个样子: \[ F[i]=\max\{A[i]+F[i-1],A[i]\}\\ G[i]=\max\{G[i-1],F[i-1]+A[i],A[i]\} \] 那么转移矩阵就应该是一个 \(3\times3\) 的矩阵。 \[ \begin