博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu4597 Play Game
阅读量:4483 次
发布时间:2019-06-08

本文共 2473 字,大约阅读时间需要 8 分钟。

Play Game

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)

Total Submission(s): 54 Accepted Submission(s): 36

Problem Description
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≤b
i≤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
 

 

Source
 

 

Recommend
liuyiding
这题就是一个区间dp,因为,每一次取都,可以取两个队列的头和尾,所以,就是一个二维的区间dp,我们用dp[al][ar][bl][br]表示,从第一个数列从al 到ar,第二个数列从,bl到br,当前这个人具有第一选择权的最大分值,那么我们,可以取两个队列的头和尾,就有4个状态转移方程了!用一个记忆化搜索就可以了!
#include 
#include
#include
#include
using namespace std;#define MAXN 26int suma[MAXN],sumb[MAXN],pa[MAXN],pb[MAXN],dp[MAXN][MAXN][MAXN][MAXN];int dfs(int al,int ar,int bl ,int br){ if(dp[al][ar][bl][br]!=-1) return dp[al][ar][bl][br]; dp[al][ar][bl][br]=0; if(al<=ar) dp[al][ar][bl][br]=suma[ar]-suma[al-1]+sumb[br]-sumb[bl-1]-dfs(al+1,ar,bl,br); if(al<=ar) dp[al][ar][bl][br]=max(dp[al][ar][bl][br],suma[ar]-suma[al-1]+sumb[br]-sumb[bl-1]-dfs(al,ar-1,bl,br)); if(bl<=br) dp[al][ar][bl][br]=max(dp[al][ar][bl][br],suma[ar]-suma[al-1]+sumb[br]-sumb[bl-1]-dfs(al,ar,bl+1,br)); if(bl<=br) dp[al][ar][bl][br]=max(dp[al][ar][bl][br],suma[ar]-suma[al-1]+sumb[br]-sumb[bl-1]-dfs(al,ar,bl,br-1)); return dp[al][ar][bl][br];}int main (){ int n,i,tcase; scanf("%d",&tcase); while(tcase--) { scanf("%d",&n); suma[0]=sumb[0]=0; for(i=1;i<=n;i++) { scanf("%d",&pa[i]); suma[i]=suma[i-1]+pa[i]; } for(i=1;i<=n;i++) { scanf("%d",&pb[i]); sumb[i]=sumb[i-1]+pb[i]; } memset(dp,-1,sizeof(dp)); printf("%d\n",dfs(1,n,1,n)); } return 0;}

 

转载于:https://www.cnblogs.com/pangblog/p/3281258.html

你可能感兴趣的文章
【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
查看>>
获取子iframe框架的元素
查看>>
WordCount bug修复录
查看>>
承载进程 (vshost.exe)
查看>>
[转]WPF MVVM 实战
查看>>
[转载] Python 标准库 urllib2 的使用细节
查看>>
Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
查看>>
Java学习——Applet写字符串(调字体)
查看>>
react路由
查看>>
nyoj 220——推桌子——————【贪心】
查看>>
java 静态方法分析
查看>>
codevs——4189 字典&&HihoCoder #1014 : Trie树
查看>>
洛谷——P1602 Sramoc问题
查看>>
【MySQL笔记】字符串、时间日期转换
查看>>
jQuery实战之仿淘宝商城左侧导航效果
查看>>
AC日记——「SCOI2016」幸运数字 LiBreOJ 2013
查看>>
unmount
查看>>
数据库连接池
查看>>
windwos iis 7.5 使用html 报405错误
查看>>
范围(地址转换)
查看>>