题意概括
给你一个序列,从前往后选择任意个数,同时偶数索引处翻倍,求序列最大值是多少。
思路
一般求最大/最小值,方案数都是 dp。因此考虑 dp。(递推也是 dp 的一种实现方法)
设 dpi,jdp_{i,j}dpi,j 为在遇到第 iii 只怪物时,已击败怪物数 mod 2=j\bmod 2 =jmod2=j 时最大经验总和,也就是已击败偶数(j=0j=0j=0)个怪物或者奇数个怪物(j=1j=1j=1)时的最大经验值。对于每个 dpi,jdp_{i,j}dpi,j 都有两个选择:击败/放过该怪物。枚举这两种情况,我们即可得出状态转移方程:
dpi,0=max(dpi−1,1+ai,dpi−1,0)dp_{i,0} = \max(dp_{i - 1,1} + a_i , dp_{i - 1,0}) dpi,0 =max(dpi−1,1 +ai ,dpi−1,0 )
dpi,1=max(dpi−1,0+2×ai,dpi−1,1)dp_{i , 1} = \max(dp_{i - 1 , 0} + 2 \times a_i , dp_{i - 1,1}) dpi,1 =max(dpi−1,0 +2×ai ,dpi−1,1 )
最后输出 max(dpn,0,dpn,1)\max(dp_{n,0},dp_{n,1})max(dpn,0 ,dpn,1 )即可。
同时,我们发现,每个 dpi,jdp_{i,j}dpi,j 和 aia_iai 在使用过两次后便不在使用,因此我们可以使用滚动数组进行优化: