如何利用动态规划来求解这类问题的最优呢?我们先将各种复杂的情况简化为2种:
不选择当前位置的数能够得到的最大收益 DP[i][0] 。
选择当前位置的数能够得到的最大收益 DP[i][1]。
那么存在这样的递推 (状态转移):
DP[i][0]=max(DP[i−1][0],DP[i−1][1])
DP[i][1]=DP[i−1][0]+a[i]
具体解释:
不选的最大收益 DP[i][0],第 i−1 个数选与不选都可以,我们挑选其中更大的那个作为当前最优方案。
选当前数的最大收益 DP[i][1],第 i−1个数只能不选,所以 DP[i][1]=DP[i−1][0]+a[i],其中 a[i]为当前数的收益 。
到这里,核心部分的思路已经介绍完了,然而这是一个环,处理到环的末尾时,我们并不知道之前有没有选第一个数。这可能在选最后一个数时造成错误。怎么解决这个问题呢?很简单,我们把这个问题做 2 次。第一次明确最后一个数是没被选的,因此第一个数选或不选都可以,递推从 1 开始。第二次明确最后一个数是被选中的,因此第一个数不能选,递推从 2 开始。我们再从这两次得到的最优解中,选择答案更优的那个就可以了。