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\n",2*ans-sum);

35     }

36     return 0;

37 }

38 /*

39 

40 */
View Code

 

你可能感兴趣的:(game)