Easy Game LightOJ - 1031

upd:似乎有复杂度更优越的做法,见http://www.cnblogs.com/hehe54321/p/8431020.html


题意:A和B玩一个游戏,A先手。规则是两人轮流在当前数列的任意一端取走任意个数(但不能两端都取),然后把这些数的和加到自己的得分上,直到数列被取完。如果两人都采取最优策略,那么A比B最多能多得多少分?

sum(l,r)表示原数列l到r范围内的数之和。ans[l][r]表示要取完l到r区间的数,先手的人可以得到的比对手多的最大得分。

那么,如果l==r,也就是只有一个,那么他必须取这一个,ans[l][r]=sum(l,r)。

否则,他可以选择在左侧取走第l个到第i个,那么自己得到sum(l,i),之后对手按照最优策略能比自己多ans[i+1][r]分,那么ans[l][r]=max{sum(l,i)-ans[i+1][r]}。他也可以选择在右侧取走第i个到第r个,那么自己得到sum(i,r),之后对手按照最优策略比自己多ans[l][i-1],那么ans[l][r]=max{sum(i,r)-ans[l][i-1]}。他也可以选择全部选完,那么ans[l][r]=sum(l,r)。最后答案就是上述三种中最大的一种。时间复杂度$O(n^3)$。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int sum[],ans[][],a[],T,TT,n;
int getsum(int l,int r)
{
return sum[r]-sum[l-];
}
int get(int l,int r)
{
if(ans[l][r]) return ans[l][r];
int i,maxans=getsum(l,r);
for(i=l;i<r;i++)
maxans=max(maxans,getsum(l,i)-get(i+,r));
for(i=r;i>l;i--)
maxans=max(maxans,getsum(i,r)-get(l,i-));
return ans[l][r]=maxans;
}
int main()
{
int i;
scanf("%d",&T);
for(TT=;TT<=T;TT++)
{
memset(a,,sizeof(a));
memset(sum,,sizeof(sum));
memset(ans,,sizeof(ans));
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
sum[i]=sum[i-]+a[i];
printf("Case %d: %d\n",TT,get(,n));
}
return ;
}

Easy Game LightOJ - 1031的更多相关文章

  1. LightOJ 1031 Easy Game (区间DP)

    <题目链接> 题目大意: 给定一段序列,两人轮流取数,每人每次只能从序列的两端的任意一段取数,取的数字位置必须连续,个数不限,问你这两人取数的最大差值是多少. 解题分析: 每人取数时面对的 ...

  2. lightoj 1031 区间dp

    题目链接: http://lightoj.com/volume_showproblem.php?problem=1031 #include<cstdio> #include<cstr ...

  3. 区间DP lightoj 1031

    在此游戏中任意时刻的状态都是原始序列的一段子序列故: 定义d(i, j) : 表示原来序列的第i ~ j个元素组成的子序列,在双方都采取最优策略的情况下,先手得分的最大值. 状态转移时,需要枚举从左边 ...

  4. lightoj 1031【区间DP,未完待续】

    题意: 给你一个n,再给你n个数,每个数<1e4; 有两个player交替取数字,每个人每一次能拿一个或多个,交替在两边拿. 游戏终止在所有的数字被取完. 两个人的分数就是所取得的数字大小总和. ...

  5. Light OJ 1031 - Easy Game(区间dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1031 题目大意:两个选手,轮流可以从数组的任意一端取值, 每次可以去任意个但仅 ...

  6. Light OJ 1031 - Easy Game(区间DP)

    题目大意: 给你一个n,代表n个数字,现在有两个选手,选手A,B轮流有有一次机会,每个选手一次可以得到一个或者多个数字,从左侧或者右侧,但是不能同时从两边取数字,当所有的数字被取完,那么游戏结束.然后 ...

  7. lightoj刷题日记

    提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...

  8. (状压) Marriage Ceremonies (lightOJ 1011)

    http://www.lightoj.com/volume_showproblem.php?problem=1011 You work in a company which organizes mar ...

  9. loj 1031(区间dp+记忆化搜索)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...

随机推荐

  1. Spark学习笔记:(一)入门 glance

    参考: http://spark.apache.org/docs/latest/quick-start.html 其它资料:    http://mojijs.com/2015/04/190845/i ...

  2. LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP

    题目链接:点这里 题解: 需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央. 然后树形DP 设定dp[i][0/1] 以1为根的情况下,以i 节点下子树 ...

  3. xamarin.Android 实现横向滚动导航

    经过一段时间的练习,自己也做了不少的demo和一些小项目,今天就把这些demo分享给大家,也当做笔记记录到自己的博客中. 这次给大家带来的是HorizontalScrollView实现横向滑动,参考博 ...

  4. linux kfifo移植

    先挖个坑,自己慢慢来填. 参考:http://blog.csdn.net/linyt/article/details/5764312 参考:http://www.cnblogs.com/Anker/p ...

  5. id、NSObject *、id<NSObject>、instancetype

    1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的 ...

  6. 用secureCRT ssh登陆不显示用户名和路径解决方案 分类: 软件工具学习 2015-03-18 16:52 36人阅读 评论(0) 收藏

    方法1         每次开始的时候输入 bash 虽然只能保存一次,但是简便. 方法2 用       vi ~/.bash_profile   编辑这个文件,  有时会提示这个文件不存在,直 ...

  7. javascript 树形菜单

    1. [代码][JavaScript]代码     var ME={ini:{i:true,d:{},d1:{},h:0,h1:0,h2:0},html:function(da,f){var s='& ...

  8. Silverlight DataBinding Converter:根据binding对象调整显示

    Silverlight DataBinding Converter:根据binding对象调整显示 我希望写一系列关于Silverlight DataBinding的文章,分别讲解Silverligh ...

  9. SPOJ:Decreasing Number of Visible Box(不错的,背包?贪心?)

    Shadowman loves to collect box but his roommates woogieman and itman don't like box and so shadowman ...

  10. BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS

    BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...