题目详情
一个双人游戏是这样玩的:给定一个非负正整数序列,你每次只能从序列头部取1个、2个或者3个数,取到的整数累加到你的得分上。两个人轮流如此,知道取完所有整数。每个人都足够聪明,每个人的目的是最大化自己的得分,请问第一个人最终的得分是多少?
输入格式
多组数据,每组数据第一行是一个正整数n,表示序列中数的个数。(n<=100000)
第二行是n个空格分隔的非负整数,表示每个数,每个数不超过1000000000。
输出格式
表示你的最终得分
答题说明
输入样例
5
1 1 1 100000 0
5
1 1 10000 0 10001
输出样例
3
10002
思路: 动态规划,不过要倒着来,即dp[i]表示第一个人从第i个元素开始取,最多能得到的分数(要注意呀,输入
数据不是题目说的那么回事,要用__int6来保存,我中枪了无数次,你呢?),那么
dp[i] = max(array[i]+sum[i+1]-dp[i+1], array[i]+array[i+1]+sum[i+2]-dp[i+2],
array[i]+array[i+1]+array[i+2]+sum[i+3]-dp[i+3])
其中sum[i]表示i到n的元素的和.
代码如下: