NYIST 1030 Yougth's Game[Ⅲ]

Yougth's Game[Ⅲ]
时间限制:3000 ms | 内存限制:65535 KB
难度:4


描述
有一个长度为n的整数序列,A和B轮流取数,A先取,每次可以从左端或者右端取一个数,所有数都被取完时游戏结束,然后统计每个人取走的所有数字之和作为得分,两人的策略都是使自己的得分尽可能高,并且都足够聪明,求A的得分减去B的得分的结果。

输入
输入包括多组数据,每组数据第一行为正整数n(1<=n<=1000),第二行为给定的整数序列Ai(-1000<=Ai<=1000)。


输出
对于每组数据,输出A和B都采取最优策略的情况下,A的得分减去B的得分的结果。


样例输入
3
1 2 3
4
2 4 5 3


样例输出
2
0


来源
Yougth原创


上传者
TC_杨闯亮

解题:dp题,dp[i][j]表示在剩下i到j时的最优结果,由于双方都采取最优策略,dp[a][b] = max(sum - dfs(a+1,b,sum-d[a]),sum - dfs(a,b-1,sum-d[b]))

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <climits>
 7 #include <vector>
 8 #include <queue>
 9 #include <cstdlib>
10 #include <string>
11 #include <set>
12 #include <stack>
13 #define LL long long
14 #define pii pair<int,int>
15 #define INF 0x3f3f3f3f
16 using namespace std;
17 const int maxn = 1002;
18 int dp[maxn][maxn],d[maxn],n;
19 int dfs(int a,int b,int sum){
20     if(a > b) return 0;
21     if(dp[a][b]) return dp[a][b];
22     dp[a][b] = max(sum - dfs(a+1,b,sum-d[a]),sum - dfs(a,b-1,sum-d[b]));
23     return dp[a][b];
24 }
25 int main() {
26     while(~scanf("%d",&n)){
27         int sum = 0;
28         for(int i = 1; i <= n; ++i){
29             scanf("%d",d+i);
30             sum += d[i];
31         }
32         memset(dp,0,sizeof(dp));
33         int ans = dfs(1,n,sum);
34         printf("%d
",2*ans-sum);
35     }
36     return 0;
37 }
38 /*
39 
40 */
View Code
原文地址:https://www.cnblogs.com/crackpotisback/p/4047008.html