NYIST 1030 Yougth's Game[Ⅲ]
2024-08-31 10:54:00
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]))
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#include <stack>
#define LL long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
int dp[maxn][maxn],d[maxn],n;
int dfs(int a,int b,int sum){
if(a > b) return ;
if(dp[a][b]) return dp[a][b];
dp[a][b] = max(sum - dfs(a+,b,sum-d[a]),sum - dfs(a,b-,sum-d[b]));
return dp[a][b];
}
int main() {
while(~scanf("%d",&n)){
int sum = ;
for(int i = ; i <= n; ++i){
scanf("%d",d+i);
sum += d[i];
}
memset(dp,,sizeof(dp));
int ans = dfs(,n,sum);
printf("%d\n",*ans-sum);
}
return ;
}
/* */
最新文章
- jQuery实战
- poj3122 pie
- HDU 1518 Square
- CSS3属性text-overflow(省略符)实战开发详解
- 如何动态加载js文件,$.getScript()方法的使用
- Java JPA @Transient 在Hibernate中应用
- CDI Features(EL(SPEL),Decorator,Interceptor,Producer)
- 【c】多级指针
- MyEclipse 皮肤、主题、背景色
- vue项目中 axios 和Vue-axios的关系
- Java知多少(67)面向字符的输入流
- 【oauth2.0】【1】简单介绍
- WPF 分享一种背景动画效果
- Spring 整合Mybatis实例
- chapter02 三种决策树模型:单一决策树、随机森林、GBDT(梯度提升决策树) 预测泰坦尼克号乘客生还情况
- 针对铁定浏览器的css选择符
- EXCEPTION-El表达式
- spoj8222
- 强类型 和弱类型 c#
- Centos7yum安装LNMP
热门文章
- 解析xml文件,遍历输出xml文件中的所有节点, 最终模仿实现struts2框架自动封装参数的功能
- Unknown tag (s:property).
- hdu 1556 线段树区间延迟更新好题
- oracle实现查询每个部门的员工工资排在前三的员工的基本信息具体举例
- 多线程的join和interrupt
- MVC发送邮件
- 2014.04.17,转帖,关于FFT的结果为什么要除以N
- 2014.08.04,读书,读书笔记-《Matlab概率与数理统计分析》-第1章 MATLAB的数据基础
- firewall 允许app访问网络
- 英语发音规则---S字母