题目描述:
在主城站街很久之后,小萌决定不能就这样的浪费时间虚度青春,他打算去打副本。
这次的副本只有一个BOSS,而且BOSS是不需要击杀的,只需要和它比智力…….
BOSS会列出一正整数的序列,由小萌先开始,然后两个人轮流从序列的任意一端取数,取得的数累加到积分里,当所有数都取完,游戏结束。
假设小萌和BOSS都很聪明,两个人取数的方法都是最优策略,问最后两人得分各是多少。
输入
第一行:一个正整数N(2 ≤ N ≤ 100),表示序列中正整数的个数。
第二行至末尾:用空格隔开的N个正整数(1 ≤ a[i] ≤ 200)
输出
只有一行,用空格隔开的两个数,小萌的得分和BOSS的得分。
样例输入
6
4 7 2 9 5 2
样例输出
在主城站街很久之后,小萌决定不能就这样的浪费时间虚度青春,他打算去打副本。
这次的副本只有一个BOSS,而且BOSS是不需要击杀的,只需要和它比智力…….
BOSS会列出一正整数的序列,由小萌先开始,然后两个人轮流从序列的任意一端取数,取得的数累加到积分里,当所有数都取完,游戏结束。
假设小萌和BOSS都很聪明,两个人取数的方法都是最优策略,问最后两人得分各是多少。
输入
第一行:一个正整数N(2 ≤ N ≤ 100),表示序列中正整数的个数。
第二行至末尾:用空格隔开的N个正整数(1 ≤ a[i] ≤ 200)
输出
只有一行,用空格隔开的两个数,小萌的得分和BOSS的得分。
样例输入
6
4 7 2 9 5 2
样例输出
18 11
思路
http://blog.youkuaiyun.com/sunquana/article/details/38497851
代码
int n;
int a[102];
int s[102][102];
int dfs(int l,int r,bool b)
{
if(s[l][r])
return s[l][r];
if(l==r){
if(!b){
s[l][r]=a[l];
return a[l];
}else{
s[l][r]=0;
return 0;
}
}
if(!b) //!b和b情况,长度一个为奇数,一个为偶数
return s[l][r]=max(dfs(l+1,r,!b)+a[l],dfs(l,r-1,!b)+a[r]);//加上选择的值
else
return s[l][r]=min(dfs(l+1,r,!b),dfs(l,r-1,!b));//不加其他值
}
int main()
{
int i,j,sum=0;
cin>>n;
for(i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
int ans=dfs(0,n-1,false);
cout<<ans<<" "<<sum-ans;
return 0;
}