USACO / A Game (经典区间DP)
A Game游戏
IOI'96 - Day 1
有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。
描述
编一个执行最优策略的程序,最优策略就是使玩家在与最好的对手对弈时,能得到的在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。
格式
PROGRAM NAME: game1
INPUT FORMAT:
(file game1.in)
第一行: 正整数N, 表示序列中正整数的个数。
第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。
OUTPUT FORMAT:
(file game1.out)
只有一行,用空格分隔的两个整数: 依次为玩家一和玩家二最终的得分。
SAMPLE INPUT
6 4 7 2 9 5 2
SAMPLE OUTPUT
18 11 分析: 简单又比较经典的区间DP,每个状态无非就是这个人从左边拿还是从右边拿嘛,然后我们看怎么表达出状态转移方程。 子问题:假设当前状态a1,a2,a3,a4,a5,如果第一个人选最左边的,则问题转化为四个数a2,a3,a4,a5,然后第二个人先选,由于题目说第二个人方案也最优,所以选的也是最优方案;先选右边同理。 转移方程:设f[i][j]表示选[i,j]区间的数,先选的那个人的最优方案。则: f[i][j]=Max{ sum[i+1][j]-f[i+1][j]+a[i](先选左边),sum[i][j-1]-f[i][j-1]+a[j](先选右边) } 因为选了一个后转化成的子问题,第二个人是先选,所以第一个人只能拿到子问题的后选的人的解,即sum[i][j]-f[i][j]。
USER: Zhipeng ZHANG [138_3531] TASK: game1 LANG: C++Compiling... Compile: OKExecuting...Test 1: TEST OK [0.000 secs, 3212 KB]Test 2: TEST OK [0.000 secs, 3212 KB]Test 3: TEST OK [0.000 secs, 3212 KB]Test 4: TEST OK [0.000 secs, 3212 KB]Test 5: TEST OK [0.000 secs, 3212 KB]Test 6: TEST OK [0.000 secs, 3212 KB]Test 7: TEST OK [0.000 secs, 3212 KB]Test 8: TEST OK [0.000 secs, 3212 KB]Test 9: TEST OK [0.000 secs, 3212 KB]Test 10: TEST OK [0.000 secs, 3212 KB]Test 11: TEST OK [0.000 secs, 3212 KB]Test 12: TEST OK [0.000 secs, 3212 KB]Test 13: TEST OK [0.000 secs, 3212 KB]Test 14: TEST OK [0.000 secs, 3212 KB]Test 15: TEST OK [0.000 secs, 3212 KB]Test 16: TEST OK [0.000 secs, 3212 KB]All tests OK.
Your program ('game1') produced all correct answers! This is your submission #2 for this problem. Congratulations!
/* ID:138_3531 LANG:C++ TASK:game1 */#include<fstream> #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<fstream> #include<queue> #include<climits> #include<vector> #include<map> #include<cmath>using namespace std;int Max(int x,int y) {return x>y?x:y; }int main() {freopen("game1.in","r",stdin);freopen("game1.out","w",stdout);int a[100];int f[100][100]; // int sum[100][100];memset(sum,0,sizeof(sum));memset(f,0,sizeof(f));int n;cin>>n;for (int i=0;i<n;i++)cin>>a[i];for (int i=0;i<n;i++)for (int j=i;j<n;j++)for (int k=i;k<=j;k++)sum[i][j]+=a[k];for (int i=n-1;i>=0;i--)for (int j=i;j<n;j++)if (i==j)f[i][j]=a[i];elsef[i][j]=Max(sum[i+1][j]-f[i+1][j]+a[i],sum[i][j-1]-f[i][j-1]+a[j]);cout<<f[0][n-1]<<" "<<sum[0][n-1]-f[0][n-1]<<endl;return 0; }
转载于:https://www.cnblogs.com/AbandonZHANG/archive/2012/08/03/2620838.html
USACO / A Game (经典区间DP)相关推荐
- LeetCode 1000. 合并石头的最低成本(经典区间DP)
1000. 合并石头的最低成本 定义dp[i][j]为尽可能多的合并区间[i, j] 所需的成本,不一定能合并成一堆,但合并完成后剩下的堆数一定小于k,更具体地,剩余的堆数一定是(n - 1) % ( ...
- Leetcode 312. 戳气球(经典区间dp)
为了避免边界问题,我们重新开一个数组,在两个端点加入哨兵1.此时数组下标为0到n+1 状态的定义如下,f[i][j] 表示将区间[i+1,j-1]的气球全部戳爆的最大收益. 我们要求的答案就是f[0] ...
- 区间dp入门——总结+习题+解析
前天学长拉了个区间dp的专题,花了两个做,今天就来做个总结吧!!! 区间dp其实就是一种建立在线性结构上的对区间的动态规划,dp本来就是很奇妙的东西,也没有什么套路,就是一种思考的数学思维方式,只有做 ...
- 算法讲解 -- 区间dp经典模型与优化(石子归并)
石子合并问题是最经典的DP问题.首先它有如下3种题型: PPT讲解:点击打开链接 (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数 ...
- 区间DP小结(附经典例题)
写这篇文章的目的主要是想总结下区间DP的经典题目,同时给自己复习巩固这方面知识点. 区间DP 一.定义 区间DP是线性动态规划的扩展,适用场景为每段区间的最优解可以通过更小区间的最优解得到.所以我 ...
- HDU-2476 String painter 区间DP
题意:给你一个长度相等的A串和B串,每次可以把一个连续的区间刷成一个字母,问从A串到B串的最少操作数. 解法:虽然这类题一看到就知道是区间DP,但是之前只做过类似从空串变成某个串的题目,所以没想到怎么 ...
- hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...
- 区间DP初探 P1880 [NOI1995]石子合并
https://www.luogu.org/problemnew/show/P1880 区间dp,顾名思义,是以区间为阶段的一种线性dp的拓展 状态常定义为$f[i][j]$,表示区间[i,j]的某种 ...
- 动态规划 —— 区间 DP
[概述] 区间型动态规划,又称为合并类动态规划,是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的区间中哪些元素合并而来有很大的关系. [思想] 区间 DP 实质上就是 ...
最新文章
- Python:Spider
- ImageView no longer exists. You should not use this PhotoViewAttacher any more
- WSUS 转发邮件中继到Office365
- SQL Server 2008 BIDS组件的安装
- spring IOC 之篇三:默认标签的解析
- 过滤XML数据中的非主流特殊字符
- IntelliJ IDEA for Mac 封装字段(添加setter/getter方法)
- 【大牛系列教学】靠着这份面试题跟答案
- python 百度ocr安装_Python调用百度OCR实现图片文字识别的示例代码
- 传统MVP用在项目中是真的方便还是累赘?
- 数据库系统概论-作业(设计本科生事务管理数据库)
- 网页另存为html有的图片无法显示,网页图片不能另存为怎么回事?网页上找到的图片不能另存的解决方法...
- tp5 给图片加水印
- caniuse-lite is outdated. Please run next command `npm update caniuse-lite browserslist`
- 分支语句和循环语句(分支语句)
- 了不起的Node.js: 将JavaScript进行到底
- 第11课:生活中的组合模式——自己组装电脑
- cmd 切换到 指定目录
- GMAP一款比对工具用于ALLHiC构建等位基因表
- ros下超声波避障仿真
热门文章
- 【往届成功检索】ICAITA2020国际学术会议来袭,诚邀参与!
- CV Code | 本周新出计算机视觉开源代码汇总(南理SGE 和Intel的实时动作识别很吸引人)...
- ResNet及其变种的结构梳理、有效性分析与代码解读(PyTorch)
- java小球碰撞实验报告_20155317 《Java程序设计》实验五网络编程与安全实验报告...
- 代码安全检视方法有_在华为写了 13 年代码,都是宝贵的经验
- 编译原理 计算机科学丛书_计算机科学导论(二)
- php com(),php|luosimao.com文档中心
- 给python小白的几个小练习(附答案详解哦)
- 专业工程师看过来~ | RDD、DataFrame和DataSet的细致区别
- Hybrid A*论文解析(5)