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 */

NYIST 1030 Yougth's Game[Ⅲ]

时间: 2024-10-20 21:16:11

NYIST 1030 Yougth's Game[Ⅲ]的相关文章

NYIST 914 Yougth的最大化

Yougth的最大化时间限制:1000 ms | 内存限制:65535 KB难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据,每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi.(1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出输出使得单位价值的最大值.(保留两位小数) 样例输入3 22 25 32 1 样例输出0.75 来源Yougth 上传者TC

NYOJ Yougth的最大化

http://acm.nyist.net/JudgeOnline/problem.php?pid=914 Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi. (1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出 输出使

LightOJ 1030 Discovering Gold【概率】

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1030 题意:基础概率题. 代码: #include <stdio.h> #include <string.h> #include <vector> #include <string> #include <algorithm> #include <iostream> #include <iterator>

【BZOJ】【1030】【JSOI2007】文本生成器

AC自动机/DP Orz ZYF 玛雅快要省选了,赶紧复(xue)习(xi)一下AC自动机…… 其实在AC自动机上DP并没有当初想的那么复杂……就是把DP的转移关系换成了AC自动机上的边而已(不过这题好像搞成了Trie图?) 1 /************************************************************** 2 Problem: 1030 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time

mysql 1030 Got error 28 from storage engine

mysql 1030 Got error 28 from storage engine 错误原因:磁盘临时空间不够. 解决办法:df -h 查看设备存储的使用情况 du -h --max-depth=1 查看目录的大小,删除一部分内容

NYIST 914Yougth的最大化【二分搜索/Dinkelbach算法】

转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187637.html 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=914 问题描述:有N个物体,它们的利益用v[i]表示,代价用c[i]表示.现在要在这N个物体中选取K个物体,使得选出来的这K个物体的总利益除以总代价达到最大值.即取得最大值. 问题转化:构造一个x[N]的数组,表示每个数取或不取的状态,显然每一个x[i]只有两个取值:

nyist oj 138 找球号(二)(hash 表+位运算)

找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,还有一个空箱子,现在有两种动作:一种是"ADD",表示向空箱子里放m(0<m<=100)个球,另一种是"QUERY",表示说出M(0<M<=100)个随机整数ki(0<=ki<=100000100),分

nyist 289

#include <stdio.h>int dp[12888];int w[3408],d[3408]; int max(int x,int y) { return x>y?x:y; } int main(){ int n,m,i,j; while(scanf("%d%d",&n,&m)!=EOF&&(n||m)) { for(i=0;i<n;i++) scanf("%d%d",&w[i],&d

nyist oj 38 布线问题 (最小生成树 prim)

布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的楼都供上电. 2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n<5) 每组测试数据的第一行是两个整数v,e. v表示学校里楼的总个数(v<=500) 随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100).(哪两栋楼间如果没有指明花费