问题:
分析
- 描述
:双方都是聪明人,牌透明,每次两端取牌,得到二个人获取的分数最大值。
- 工具
先手的目标是 使得 当前的牌 + 下一步作为后手会得到的分数 返回总分较大;先手的base’case就是只有一张牌,拿走(返回)。
后手的目标是 使得 去掉第一张牌后(假设被另外一个玩家拿走了这个) 作为先手的结果 和 去掉最后一 张牌 作为先手的结果 返回总分较 小;// 聪明的人; 后手的base case就是只有一张牌,返回0。
- 目标
:一个人先手,一个人后手,返回值较大值者。
/*
* @Author: HerrDing (1103037805@qq.com)
* @Date: 2022-04-23 18:35:53
* @LastEditors: HerrDing
* @LastEditTime: 2022-04-23 19:19:09
* @FilePath: /刷题/cardgame.cpp
* @Description: zero-sum game
*
* Copyright (c) 2022 by Ding, All Rights Reserved.
*/
#include <iostream>
#include <vector>
using namespace std;
class CardGame
{
public:
int Process(const vector<int> &card_v)
{
if (card_v.size() == 0)
{
return 0;
}
return max(FirstHand(card_v, 0, card_v.size() - 1),
SecondHand(card_v, 0, card_v.size() - 1));
}
private:
int FirstHand(const vector<int> &card_v, int l, int r)
{
if (l == r)
{
return card_v.at(l);
}
return max(card_v.at(l) + SecondHand(card_v, l + 1, r),
card_v.at(r) + SecondHand(card_v, l, r - 1));
}
int SecondHand(const vector<int> &card_v, int l, int r)
{
if (l == r)
{
return 0;
}
return min(FirstHand(card_v, l + 1, r),
FirstHand(card_v, l, r - 1));
}
};
int main()
{
CardGame test;
vector<int> vec{1, 3, 100, 2};
cout << test.Process(vec) << endl;
return 0;
}