首页 > 代码库 > nyoj 1030
nyoj 1030
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的得分的结果。
- 样例输入
31 2 342 4 5 3
- 样例输出
20
- 来源
- Yougth原创
- 上传者
- TC_杨闯亮
转#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<stdlib.h>#include<vector>using namespace std;int a[1009],sum[1009],dp[1009][1009];int main(){ int n,i,j,k; while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); sum[0]=0; for(i=1;i<=n;i++){ scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } for(i=1;i<=n;i++){ //因为这个dp[i][j]用到的是dp[i+1][j],所以要这样写,先更新了每个dp[i][j]对应的dp[i+1][j] for(j=1,k=i;k<=n;k++,j++){ //这里我想了好久, dp[j][k]=a[j]+(sum[k]-sum[j]-dp[j+1][k]);//这个是A取左边的那个数,A先取,然后B在j+1~k之间取,dp[j+1][k],相当于是对于A先取的情况来说的,现在是在dp[j+1][k]中先取B,这样A的值就是(sum[k]-sum[j]-dp[j+1][k]) if((a[k]+(sum[k-1]-sum[j-1]-dp[j][k-1]))>dp[j][k]) dp[j][k]=a[k]+(sum[k-1]-sum[j-1]-dp[j][k-1]); } } printf("%d\n",dp[1][n]-(sum[n]-dp[1][n])); } return 0;}
nyoj 1030
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。