题目描述
航天博物馆中有一个互动游戏。给出N个数字(C1、C2、C3、…、CN)排成一排,现有A和B两个人轮流取数字,每次可以取当前剩余数字中最左侧或者最右侧之一并拿走。最终每个人分数是拿到的数字之和。分数较高者将获得航天纪念品一个。
游戏开始时,A先取数字,两人都会按照最优策略来取数字,现在想知道A先手可以拿到最多的分数是多少?
输入说明
第一行:单个整数N,表示一共多少个数字,1≤N≤5000
第二行到第N+1行:第i+l行有一个整数Ci,1≤Ci≤5000
输出说明
一个整数,表示如果双方都按最优策略玩游戏,A先手可以得到的分数。
输入样例
4
30
25
10
35
输出样例
60
AC代码
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int num[n];
int dp[n];
int sum = 0;
for(int i = 0; i < n; i++) {
cin >> num[i];
sum += num[i];
dp[i] = num[i];
}
for(int i = n - 1; i >= 0; i--) {
for(int j = i + 1; j < n; j++) {
dp[j] = max(num[i] - dp[j],num[j] - dp[j - 1]);
}
}
cout << (sum + dp[n - 1]) / 2;
return 0;
}