0
点赞
收藏
分享

微信扫一扫

蓝桥杯 算法训练 逗志芃的危机

忆北文学摄影爱好员 2022-03-12 阅读 119

蓝桥杯 算法训练 逗志芃的危机

题目描述

  • 资源限制
    时间限制:1.0s 内存限制:256.0MB
  • 问题描述
    逗志芃又一次面临了危机。逗志芃的妹子是个聪明绝顶的人,相比之下逗志芃就很菜了。现在她妹子要和他玩一个游戏,这个游戏是这样的:一共有n个数(n是偶数)写成一行,然后两个人轮流取数,每次只能从最前面或者最后面取走一个数,全部取完则游戏结束,之后每个人取走的数的和就是每个人的得分。由于逗志芃妹子很厉害,但他又不想输,所以只能找到你了,你要告诉他最多可以得到多少分。(注意,妹子智商是maxlongint所以是不会犯错的,每次的策略必然最优,而且逗志芃是先手)
  • 输入格式
    第一行一个数n,表示有n个数。
    第二行就是进行游戏的n个数。
  • 输出格式
    一个数,最高得分
  • 样例输入
    2
    10 20
  • 样例输出
    20
  • 数据规模和约定
    例:0<n,m<=1000,每个数不超过10000 。

方案1 递归 记忆化搜索 剪枝 博弈论

#include<iostream>
#include<algorithm>

using namespace std;

int n;					//n个数			
int	nums[1000];			//数字数组 
int ans[1000][1000];	//ans[i][j]:在[i...j]范围内, 逗志芃所能获得的最大数的和 

//函数功能:L~R范围内, 当id先手时,逗志芃所能获得的最大数的和 
int f(int L, int R, int nums[], int id){
	//如果该答案已被记录,直接返回 
	if(ans[L][R]!=0){
		return ans[L][R];
	}
	
	//当只有一个数时,由于逗志芃先手,且共有偶数个数,故该数只能被逗志芃妹妹获取,故逗志芃获取数的和为0 
	if(L==R){
		return 0;
	}
	
	//当逗志芃开始取数时: ans[L][R] = max(nums[L]+ans[L+1][R], nums[R]+ans[L][R-1]) 
	if(id==0){
		return ans[L][R] = max(nums[L]+f(L+1, R, nums, 1), nums[R]+f(L, R-1, nums, 1));
	}else{	//当逗志芃妹妹开始取数时,必然会选择让逗志芃取最少的数和:ans[L][R] = min(ans[L+1][R], ans[L][R-1]) 
		return ans[L][R] = min(f(L+1, R, nums, 0), f(L, R-1, nums, 0));
	}
}
					
int main(){	
	cin>>n;
	for(int i=0; i<n; ++i){
		cin>>nums[i];
	}
	cout<<f(0, n-1, nums, 0)<<endl;
	return 0; 
} 

方案2 动态规划 博弈论

#include<iostream>
#include<algorithm>

using namespace std;

int n;					//n个数			
int	nums[1000];			//数字数组 
int ans[1000][1000];	//ans[i][j]:在[i...j]范围内, 逗志芃所能获得的最大数的和 
					
int main(){	
	cin>>n;
	for(int i=0; i<n; ++i){
		cin>>nums[i];
	}
	
	for(int R=0; R<n; ++R){
		for(int L=R; L>=0; --L){
			//当只有一个数时,由于逗志芃先手,且共有偶数个数,故该数只能被逗志芃妹妹获取,故逗志芃获取数的和为0 
			if(L == R){
				ans[L][R] = 0;
			}else if((R-L)&1){	//还有偶数个数时逗志芃先手:ans[L][R] = max(nums[L]+ans[L+1][R], nums[R]+ans[L][R-1])  
				ans[L][R] = max(nums[L]+ans[L+1][R], nums[R]+ans[L][R-1]);
			}else{				//还有奇数个数时逗志芃妹妹先手: ans[L][R] = min(ans[L+1][R], ans[L][R-1])
				ans[L][R] = min(ans[L+1][R], ans[L][R-1]); 
			}
		}
	} 
	
	cout<<ans[0][n-1]<<endl;
	return 0; 
} 
举报

相关推荐

0 条评论