【UVA-10891】Game of Sum【区间DP】
题意:
一个序列,选手 AAA、BBB 轮流从序列中从左端或者右端选一段区间,然后区间和加到自己的权值中。两个选手都会按照最优的方式进行选取,问先手 AAA 最多可以比 BBB 多拿多少。 (1≤n≤100)(1\leq n\leq 100)(1≤n≤100)
思路:
很明显这是一道 DPDPDP 问题,又因为只能从左端点或右端点拿,因此不难想到用区间 DPDPDP 的方法来解决此题。
既然是区间 DPDPDP,那么最常见的状态就是 DP[i][j]DP[i][j]DP[i][j] 表示对于区间 [i,j][i,j][i,j] ,先手最多领先后手多少。又因为区间和是一定的,因此已知选手 AAA 获得的价值就可以知道选手 BBB 获得的价值,因此修改状态为 DP[i][j]DP[i][j]DP[i][j] 表示区间 [i,j][i,j][i,j],先手最多可以获得多少价值。
因此 DP[i][j]=max(sum[i][j]−DP[x][j],sum[i][j]−DP[i][y]),i<x,y<jDP[i][j] = max(sum[i][j]-DP[x][j],sum[i][j]-DP[i][y]),i < x,y < jDP[i][j]=max(sum[i][j]−DP[x][j],sum[i][j]−DP[i][y]),i<x,y<j,由于 nnn 比较小,直接枚举区间长度,从小区间到大区间进行转移即可。
//UVA 10891
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 200;int n,a[N],sum[N],dp[N][N];
//dp[i][j]: 表示区间[i,j]先手能够获得的最大价值int main()
{while(~scanf("%d",&n)){if(!n) break;memset(dp,0,sizeof dp);rep(i,1,n) scanf("%d",&a[i]);rep(i,1,n) sum[i] = sum[i-1]+a[i];rep(len,1,n)rep(i,1,n-len+1){int j = i+len-1;dp[i][j] = sum[j]-sum[i-1];rep(k,1,len-1){dp[i][j] = max(sum[j]-sum[i-1]-dp[i+k][j],dp[i][j]);dp[i][j] = max(sum[j]-sum[i-1]-dp[i][j-k],dp[i][j]);} }int ans = dp[1][n]-(sum[n]-sum[0]-dp[1][n]);printf("%d\n",ans);}return 0;
}
【UVA-10891】Game of Sum【区间DP】相关推荐
- 【UVA - 10891 Game of Sum 】【HRBUST - 1622】 Alice and Bob (区间dp,博弈问题)
题干: 有一个长度为N的整数序列,Alice和Bob轮流取数,Alice先取.每次玩家只能从左端或者右端 取一个或多个数,但不能两端都取.所有数都被取走后游戏结束,然后统计每个人取走的所有数之和, 作 ...
- UVA 10891——Game of Sum
题意:给定一个长度为n的序列,两个人分别从两端开始取若干数,但是规定要么左,要么右,问双方都采取最优策略下A的总和减去B的值. 思路:区间dp,dp(i,j)表示先手的总和,那么状态转移方程便为dp( ...
- [UVA 10891] Game of Sum
图片加载可能有点慢,请跳过题面先看题解,谢谢 很容易想到这样一个状态: \(dp[l][r]\) 表示,\(l\) 到 \(r\) 这一段区间,双方都使用最优策略时,先手能得到的最大分数 $ $ 那么 ...
- uva 10891 - Game of Sum
题解 白书上 总和一定的 dp 题:经典题 1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring ...
- UVA 10003 Cutting Sticks (区间dp)
题意: 给你一根木块,让你在n个点切块(不能改变顺序),使得总花费最小,看拿来切的那根木棍的长度. 代码: #include <map> #include <set> #inc ...
- Sticks UVA - 307(切木棍 线性区间dp,线性dp,区间思想。)
题目大意:将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短 Time limit 3000 ms OS Linux George took sticks of the sam ...
- UVa在线比赛单题汇总-----DP专题
动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...
- 【LightOJ - 1031】Easy Game (区间dp,博弈)
题干: You are playing a two player game. Initially there are n integer numbers in an array and player ...
- hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...
- 【区间dp】uva10003+ uva 1626 括号匹配问题 【有空自己记忆化写一下!!!】
讲道理,其实我还不是太懂,这个题看到了两种写法 之前大概想的差不多,要这样实现呀: 常规写法,大概n--3 递归写法,稍微好理解一点 好了,接下来自从看了liuchuo的博客我要变身玛丽苏橙色了 题目 ...
最新文章
- 首个深度强化学习AI,能控制核聚变,成功登上《Nature》
- 宏基因组公众号7月精选文章目录
- 《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景
- 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]...
- javascript --- XHR(XMLHttpRequet)对象
- 两端对齐布局与text-align:justify
- SQL SERVER 内存分配及常见内存问题(1)——简介
- 三星Galaxy Note 10系列机模曝光:开孔全面屏实锤
- LSTM block和cell区别
- 转载:::::简单分享一个轻量级自动化测试框架目录结构设计
- 微型计算机控制课程设计,《微型计算机控制技术》课程设计
- Xcode9.0、Xcode9.1修改模拟器尺寸
- 熊猫聚财独家揭秘-你不知道的避坑赚钱宝典
- waf怎么读_技术分享:杂谈如何绕过WAF(Web应用防火墙)
- Kubernetes 最新版本安装过程和注意事项
- 京东方数字艺术产业论坛:感受科技的艺术之美
- Qt编写百度地图综合应用(在线+离线+区域)
- 计算机网络(四)运输层(TCP/IP)
- Java实现的LU分解,高斯消去法求线性方程组的解
- python爬虫获取历史天气信息
热门文章
- 因为机遇,不会轻易悲伤
- whey some page need header when your fetch that page and some don't need
- 大型网站的架构设计问题----大型高并发高负载网站的系统架构[转]
- 云计算计算机二级,2021计算机二级office用的是哪个版本
- python测试用例不通过发送报告_python+unittest 多用例测试执行失败的问题
- tkinter 中给某个文本加上滚动条_python中wx模块的具体使用方法
- pat A1052:Linked List Sorting静态链表+链表排序
- 呆瓜半小时入门python数据分析_金融和生物信息学多个实战案例
- 0 y 100写成c语言,c语言100编程实例
- linux下ftp二进制传输,FTP的两种传输模式:BINARY和ASCII