题目:有一个整型数组A,代表数值不同的纸牌排成一条线。玩家a和玩家b依次拿走每张纸牌,规定玩家a先拿,玩家b后拿,但是每个玩家每次只能拿走最左或最右的纸牌,
请返回最后获胜者的分数。
思路:暴力递归,典型的“范围”上尝试的模型
上代码
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <algorithm>
using namespace std;
typedef vector<int> myvci;
int s(myvci arr, int l, int r);
//先手选择
int f(myvci arr, int l, int r)
{
if (l == r)
{
return arr[l];唯一的纸牌拿
}
return max(arr[l] + s(arr, l + 1, r), 先手 选最大的 i j+1是后手
arr[r] + s(arr, l, r - 1));
}
//后手函数
int s(myvci arr, int l, int r)
{
if (l == r) //只剩一张纸牌的时候轮不到你拿
{
return 0;
}
return min(f(arr, l + 1, r),//对手在拿 所以不加 arr[i] 对手让你选后续最小值
f(arr, l, r - 1));//对手会让你选最小值
}
int CardsInLine_test (myvci arr)
{
if (arr.size() == 0)
{
return 0;
}
if (arr.size() == 1)//只有一张牌
{
return arr[0];
}
//1)arr[L]+s(arr,L+1,R); //先手拿左边的牌 剩下L+1 R 后手
//2)arr[R]+ S(arr,L,R-1)//先手拿右边的牌,剩下 L-R-1后手
return max(f(arr, 0, arr.size() - 1), s(arr, 0, arr.size() - 1));
}
//范围上尝试
void CardsInLine_main()
{
cout << "***********CardsInLine_main***********" << endl;
myvci arr;
arr.push_back(1);
arr.push_back(9);
arr.push_back(1);
int re=CardsInLine_test(arr);
cout<<re<<endl;
}