当前位置: 首页 > news >正文

UVA 10891 Game of Sum(区间DP(记忆化搜索))

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1832

题目大意:

两个人在玩一个游戏:

给你一行n个数字,每次只能从左端或者右端取一个或多个数字。

每个人的分值就是他们各自取得的数字之和。

假设两人都足够聪明,问先手最多能比后手多多少分。

解题思路:

其实题目意思就是先手最多能得到多少分。

设dp[l][r]是取完[l,r]的数字时先手能获得的最大分值,sum是[l,r]的数字之和。

那么可以得到状态转移方程:

dp[l][r]=max(dp[l][r],sum-dp[i+1][r]),(l=<i<=r)

dp[l][r]=max(dp[l][r],sum-dp[l][i-1]),(l<=i<=r)

这里sum-子区间最优解的操作相当于取反,就是子区间的先手变成了后手,后手变成了先手的意思。

代码:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cctype>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<set>
10 #include<map>
11 #include<stack>
12 #include<string>
13 #define lc(a) (a<<1)
14 #define rc(a) (a<<1|1)
15 #define MID(a,b) ((a+b)>>1)
16 #define fin(name)  freopen(name,"r",stdin)
17 #define fout(name) freopen(name,"w",stdout)
18 #define clr(arr,val) memset(arr,val,sizeof(arr))
19 #define _for(i,start,end) for(int i=start;i<=end;i++)
20 #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
21 using namespace std;
22 typedef long long LL;
23 const int N=1e3+5;
24 const int INF=0x3f3f3f3f;
25 const double eps=1e-10;
26 
27 int a[N],dp[N][N];
28 
29 int solve(int l,int r){
30     if(l>r) return 0;
31     if(dp[l][r]!=-INF)
32         return dp[l][r];
33     int sum=a[r]-a[l-1];
34     //从左端取
35     for(int i=l;i<=r;i++){
36         dp[l][r]=max(dp[l][r],sum-solve(i+1,r));
37     }
38     //从右端取
39     for(int i=r;i>=l;i--){
40         dp[l][r]=max(dp[l][r],sum-solve(l,i-1));
41     }
42     return dp[l][r];
43 }
44 
45 int main(){
46     int n;
47     while(cin>>n&&n){
48         for(int i=1;i<=n;i++){
49             for(int j=1;j<=n;j++){
50                 dp[i][j]=-INF;
51             }
52         }
53         for(int i=1;i<=n;i++){
54             cin>>a[i];
55             dp[i][i]=a[i];
56             a[i]+=a[i-1];
57         }
58         solve(1,n);
59         cout<<2*dp[1][n]-a[n]<<endl;
60     } 
61     return 0;
62 }

 

转载于:https://www.cnblogs.com/fu3638/p/8910112.html

相关文章:

  • Python学习4,字符串
  • BZOJ 3097: Hash Killer I
  • [转组第一天] | 调研XSS攻击
  • 2018年最新搜索引擎转跳JavaScript代码(竞价广告专用)
  • Java多线程实现的三种方式
  • 服务端渲染
  • 【转】数据库范式(1NF 2NF 3NF BCNF)
  • 父元素与子元素之间的margin-top问题(css hack)
  • 20180427积累
  • 关于sqoop --split-by 及 -m的理解
  • 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告
  • 往idea中导入已有的web项目
  • webpakc4.0移除了 CommonsChunkPlugin 组建
  • 判断Python输入是否为数字、字符(包括正则表达式)
  • 《C》指针
  • 时间复杂度分析经典问题——最大子序列和
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2019.2.20 c++ 知识梳理
  • idea + plantuml 画流程图
  • JS函数式编程 数组部分风格 ES6版
  • SwizzleMethod 黑魔法
  • yii2中session跨域名的问题
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 关于for循环的简单归纳
  • 好的网址,关于.net 4.0 ,vs 2010
  • 前言-如何学习区块链
  • 微信小程序填坑清单
  • 与 ConTeXt MkIV 官方文档的接驳
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 栈实现走出迷宫(C++)
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • gunicorn工作原理
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 阿里云ACE认证学习知识点梳理
  • 从如何停掉 Promise 链说起
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ![CDATA[ ]] 是什么东东
  • # 达梦数据库知识点
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #mysql 8.0 踩坑日记
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (26)4.7 字符函数和字符串函数
  • (办公)springboot配置aop处理请求.
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)LINQ之路
  • (转)Linux下编译安装log4cxx
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat文件调用java类的main方法
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET值类型变量“活”在哪?