算法(37)-暴力递归(4)-纸牌博弈-c++

题目:有一个整型数组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;

}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值