HDU——4597 Play Game (对抗搜索)

Alice and Bob are playing a game. There are two piles of cards. There are N cards in each pile, and each card has a score. They take turns to pick up the top or bottom card from either pile, and the score of the card will be added to his total score. Alice and Bob are both clever enough, and will pick up cards to get as many scores as possible. Do you know how many scores can Alice get if he picks up first?

Input

The first line contains an integer T (T≤100), indicating the number of cases. 
Each case contains 3 lines. The first line is the N (N≤20). The second line contains N integer a i (1≤a i≤10000). The third line contains N integer b i (1≤bi≤10000).

Output

For each case, output an integer, indicating the most score Alice can get.

Sample Input

2 
 
1 
23 
53 
 
3 
10 100 20 
2 4 3 

Sample Output

53 
105 

题意:有两堆卡牌,每堆都为N张卡牌,每张卡牌有一定的分数,有A,B两个人,他们只能从这两堆中的顶部或者底部抽出一张牌,并且拥有该分数,问当A先手时,他能获得的最大分数是多少。

题解:对抗搜索,菜鸡我第一次写对抗搜索,代码中 l1——r1为第一堆剩下的卡牌,l2——r2为第二堆剩下的卡牌。要想分数最大,他能获得的最大分数 = cur(总分数)- 上一步中另一个人获得的最大分数,因为两个人都足够聪明~~,详细看代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX = 22;
int val1[MAX],val2[MAX];
int dp[MAX][MAX][MAX][MAX];
int n,sum;
int dfs(int l1,int r1,int l2,int r2,int cur){
	if(l1>r1&&l2>r2) return dp[l1][r1][l2][r2];//不加超时对应return
	if(dp[l1][r1][l2][r2]!=0) return dp[l1][r1][l2][r2];//不加超时对应return
	int cmp=0;
	if(l1<=r1){
		cmp=max(cmp,cur-dfs(l1+1,r1,l2,r2,cur-val1[l1]));
		cmp=max(cmp,cur-dfs(l1,r1-1,l2,r2,cur-val1[r1]));
	}
	if(l2<=r2){
		cmp=max(cmp,cur-dfs(l1,r1,l2+1,r2,cur-val2[l2]));
		cmp=max(cmp,cur-dfs(l1,r1,l2,r2-1,cur-val2[r2]));
	}
	return dp[l1][r1][l2][r2]=cmp;//要加上 “dp[l1][r1][l2][r2]=”cmp,要不然超时
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		sum=0;//求总分的变量
		for (int i = 1; i <= n;i++){
			scanf("%d",&val1[i]);
			sum+=val1[i];
		}
		for (int i = 1; i <= n;i++){
			scanf("%d",&val2[i]);
			sum+=val2[i];
		}
		memset(dp,0,sizeof(dp));//别忘记初始化
		printf("%d\n",dfs(1,n,1,n,sum));
	}
	return 0;
} 

 

全部评论

相关推荐

Tom哥981:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务