关于神奇的状态。
- 设为最后一次是否打在~列中,一共打了颗子弹的最大得分
- 附初始值
g[0][j][dk]=g[0][j-1][dk];
g[1][j][dk]=g[1][j-1][dk];
其中枚举的是打了几颗子弹,的循环范围为到。
for(register int i=n;i>=up[j];--i)
if(dk>=kg[i][j])
if(!f[i][j])
g[1][j][dk]=max(g[1][j][dk],g[0][j-1][dk-kg[i][j]]+s[i][j]),
g[0][j][dk]=max(g[0][j][dk],g[0][j-1][dk-kg[i][j]]+s[i][j]);
else
g[1][j][dk]=max(g[1][j][dk],g[1][j-1][dk-kg[i][j]]+s[i][j]),
g[0][j][dk]=max(g[0][j][dk],g[0][j-1][dk-kg[i][j]]+s[i][j]);
最后一枚子弹如果想要最优的话,一定要打到上(),所以假设此时打出了最后一枚子弹,那么它是可以由没有打出最后一枚子弹的状态转移过来的。至于为什么是,本列中下面的已经被打完了(),当然是从前一列转过来阿!如果此时是的话一定不可能是最后一枚子弹那么假设已经打了最后一枚了,这一枚只能算是附加的了,不可能再由没有打最后一枚的状态转移过来的了,所以如代码中所示。