有n个不同币值的硬币排成一列,甲乙两人轮流取这些硬币,每次只能从一端取一枚。假设甲乙两人都足够聪明,会采用最优策略以使自己所取得的硬币币值总和尽量大,求先取的一人所取到的总币值?
假设当前有k枚硬币,左右两端硬币为left、right,总币值为Sum(left,right),此轮取币采用最优策略可获得总币值记为M(left,right),较差一方获得总币值记为L(left,right)则:
M(k) = max(v[left] + L(left + 1,right) , v[right] + L(left, right - 1)) 其中L(left,right) = Sum(left, right) - M(left, right)
剩1枚硬币,直接取;
剩2枚硬币,取大端;
剩3枚硬币,取大端;
剩4枚硬币,v1 v2 v3 v4,如果v1 + M(2,4) > v4 + M(1,3) 取1,否则取4;
......
每次取硬币都是两人一轮博弈,一人采取最优策略获得较好收益,那么另一人必然获得较差收益,所以最佳策略是每次取两端中币值与下一次较差收益之和较大的一枚。
#include <iostream>
using namespace std;
int best(int v[],int valueSum, int left, int right)
{
if(right - left > 1)
{
int leftSum = valueSum - be