洛谷 P1430 解题报告
P1430 序列取数
题目描述
给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取)。每个人可从序列的左端或右端取若干个数(至少一个),但不能两端都取。所有数都被取走后,两人分别统计所取数的和作为各自的得分。假设\(A\)和\(B\)都足够聪明,都使自己得分尽量高,求\(A\)的最终得分。
输入输出格式
输入格式:
第一行,一个正整数\(T\),表示有\(T\)组数据。\((T<=100)\)
接着\(T\)行,每行第一个数为\(n\),接着\(n\)个整数表示给定的序列.
输出格式:
输出\(T\)行,每行一个整数,表示\(A\)的得分
看到足够聪明,我下意识以为是博弈论。。
但是似乎并不是,而且我想不出来怎么做。
对于取剩下的子序列\([i,j]\),先手有一个可求的最大得分值。
令\(dp[i][j]\)为子序列\([i,j]\)时,先手取可得的最大分数。
\(dp[i][j]=max(sum[i][j],sum[i][j]-min\{dp[i+k_1][j],dp[i][j-k_2],k_1\in[1,j-i],k_2\in[1,j-i]\})\)
分别对应先手者(于此步的)选全部,选左边的一段和选右边的一段三种情况。
我们发现这是三维的,需要枚举\(k\)。
优化?
拿\(l[i][j]\)维护\(min\{dp[i+k_1][j],k_1\in[1,j-i]\}\)
拿\(r[i][j]\)维护\(min\{dp[i][j-k_2],k_2\in[1,j-i]\}\)
当然,这两个东西的更新都是\(O(1)\)的
细节:注意区间DP的枚举顺序性
code:
#include <cstdio>
#include <cstring>
const int N=1010;
int max(int x,int y) {return x>y?x:y;}
int min(int x,int y) {return x>y?y:x;}
int n,t;
int a[N],f[N],dp[N][N],l[N][N],r[N][N];
//l[i][j]=min{dp[i][j],dp[i+1][j]...dp[j][j]};
int read()
{
int x=0,ff=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') ff=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return ff*x;
}
int main()
{
t=read();
for(int k=1;k<=t;k++)
{
n=read();
memset(f,0,sizeof(f));
memset(dp,0,sizeof(dp));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for(int i=1;i<=n;i++)
{
a[i]=read();
f[i]=f[i-1]+a[i];
}
for(int i=1;i<=n;i++)
{
dp[i][i]=a[i];
l[i][i]=a[i];
r[i][i]=a[i];
}
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
{
int sum=f[j]-f[i-1];
dp[i][j]=max(sum,max(sum-l[i+1][j],sum-r[i][j-1]));
l[i][j]=min(l[i+1][j],dp[i][j]);
r[i][j]=min(r[i][j-1],dp[i][j]);
}
printf("%d\n",dp[1][n]);
}
return 0;
}
2018.5.1
洛谷 P1430 解题报告的更多相关文章
- 洛谷 P1462 解题报告
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- 洛谷 P1879 解题报告
P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...
- 洛谷 P1069 解题报告
P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...
- 洛谷 P2491 解题报告
P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...
- 洛谷 P2587 解题报告
P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...
- 洛谷 P1054 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1053 解题报告
P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...
- 洛谷 P1057 解题报告
P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...
- 洛谷 P1613 解题报告
P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...
随机推荐
- (NO.00001)iOS游戏SpeedBoy Lite成形记(十二)
如果选手能在加速的时候屁股产生推进器效果就跟好了,仿佛选手腾云驾雾的感觉.我们可以用Cocos2D中的CCMotionStreak类来轻松实现.下面在Player.h接口文件添加以下代码: @prop ...
- css3的样式讲解-css学习之旅(3)
css背景 属性:background-color:background-image:url("位置"):background-position:right等,px,百分数:bac ...
- Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池
一般来讲一个网络访问就需要App创建一个线程来执行,但是这也导致了当网络访问比较多的情况下,线程的数目可能积聚增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可 ...
- nginx 编译增加新的模块
原已经安装好的nginx,现在需要添加一个未被编译安装的模块: nginx -V 可以查看原来编译时都带了哪些参数 原来的参数:--prefix=/app/nginx 添加的参数: --with-ht ...
- Java-HttpServlet
/** * * Provides an abstract class to be subclassed to create * an HTTP servlet suitable for a Web s ...
- Bookmarkable Pages
Build a Bookmarkable Edit Page with JDeveloper 11g Purpose In this tutorial, you use Oracle JDevel ...
- Android实训案例(二)——Android下的CMD命令之关机重启以及重启recovery
Android实训案例(二)--Android下的CMD命令之关机重启以及重启recovery Android刚兴起的时候,着实让一些小众软件火了一把,切水果,Tom猫,吹裙子就是其中的代表,当然还有 ...
- PHP开发环境apache搭建
首先我们先来了解一下PHP的一些相关的基础知识: PHP是啥? php其实就是超文本预处理程序,一种制作网站的脚本程序. 通常PHP的运行环境有以下两种: wamp windows+apache+m ...
- svn中出现各种感叹号说明
黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别 ...
- 闫燕飞:Kafka的高性能揭秘及优化
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文首发在云+社区,未经许可,不得转载. 大家下午好,我是来自腾讯云基础架构部ckafka团队的高级工程师闫燕飞.今天在这里首先为大家先分享 ...