https://www.cnblogs.com/cmmdc/p/7204991.html 写的好。
方法2的思想是:
例如要释放 a1,a2,...,aQ囚犯,我们记为A[1]-A[Q],先分成最小的区间开始找,为了方便,我们把两端也加入,这样变为A[0]-A[Q+1]
什么叫最小的区间?就是在区间里面只有一个要释放的囚犯,这样的区间(长度为2)是 A[0]−A[2],A[1]−A[3]..A[Q−1]−A[Q+1],求出其对应的金币,我们记为Cost[0][2],Cost[1][3]...Cost[Q−1][Q+1]
然后我们再找区间里面只有两个要释放的囚犯,这样区间(长度为3)可以用上面长度为2的区间来求得 例如 A[0]-A[3]
如果先释放1号,对应的是Cost[1][3]加上a0与a1之间的囚犯数
如果先释放2号,对应的是Cost[0][2]加上a2与a3之间的囚犯数
然后Cost[0][3]就是上面值更小的一个情况
这样不断迭代,最后就可以求出Cost[0][Q+1],就是最后的答案
枚举的时候,由于可能会出现多次相同的情况,但前面又已经计算过了,所以可以利用一个数组,来保存已经计算过的情况(剪枝)。