逗志芃的危机
问题描述
逗志芃又一次面临了危机。逗志芃的妹子是个聪明绝顶的人,相比之下逗志芃就很菜了。现在她妹子要和他玩一个游戏,这个游戏是这样的:一共有n个数(n是偶数)写成一行,然后两个人轮流取数,每次只能从最前面或者最后面取走一个数,全部取完则游戏结束,之后每个人取走的数的和就是每个人的得分。由于逗志芃妹子很厉害,但他又不想输,所以只能找到你了,你要告诉他最多可以得到多少分。(注意,妹子智商是maxlongint所以是不会犯错的,每次的策略必然最优,而且逗志芃是先手)
输入格式
第一行一个数n,表示有n个数。
第二行就是进行游戏的n个数。
输出格式
一个数,最高得分
样例输入
2
10 20
样例输出
20
数据规模和约定
例:0<n,m<=1000,每个数不超过10000 。
解析:
代码思路 :从R = 0 开始L = R
然后L - - 这样子把区间[0 ~ n] 的L ~ R的必要情况都枚举到了,还是很厉害的
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1010;
int a[N],res[N][N];
int n;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++) scanf("%d",&a[i]);
for(int r = 0; r < n; r ++)
for(int l = r; l >= 0; l --)
{
if(l == r) res[l][r] = 0; //只剩下一个数了(奇数个) 那这个数 我是后手 就没有了
else if((r - l) & 1) {
//偶数个
res[l][r] = max(a[l] + res[l + 1][r], a[r] + res[l][r - 1]);
} else{
res[l][r] = min(res[l + 1][r], res[l][r - 1]);
}
}
cout << res[0][n-1];
return 0;
}