博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO 3.3 游戏
阅读量:6816 次
发布时间:2019-06-26

本文共 1337 字,大约阅读时间需要 4 分钟。

https://www.luogu.org/problemnew/show/P2734

是道好dp,加深了我对区间dp的理解

一开始可以有思路:f[i][j]表示区间i-j内,先手的最大得分

但是转移有困难,因为我在思考第二个人会怎么走

实际上这是没有必要的,动态规划不考虑所有步的细节,而是从前一种状态转移,至于前一种如何,并不关心

考虑到,当f[i][j]的人先手取完之后,剩下的就是第二个人,这是可以把他认为是先手

那么第一个人可能取a[i]或a[j],那剩下的人取的就是f[i + 1][j]或者f[i][j - 1],那么区间i-j的和减第二个人的得分就是第一个人的得分

时间:1.0h

#include
#include
#include
#include
using namespace std;inline int read(){ int ans = 0,op = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { (ans *= 10) += ch - '0'; ch = getchar(); } return ans * op;}const int maxn = 105;int n;int sum[maxn],a[maxn];int f[maxn][maxn];/*int dp(int i,int j){ if(j < i) return 0; if(f[i][j]) return f[i][j]; return f[i][j] = max(sum[j] - sum[i] - dp(i + 1,j),sum[j - 1] - sum[i - 1] - dp(i,j - 1)); }*/ int main(){ n = read(); for(int i = 1;i <= n;i++) a[i] = read(),f[i][i] = a[i]; for(int i = 1;i <= n;i++) sum[i] = sum[i - 1] + a[i]; for(int i = n - 1;i >= 1;i--) for(int j = i + 1;j <= n;j++) f[i][j] = max(sum[j] - sum[i - 1] - f[i + 1][j],sum[j] - sum[i - 1] - f[i][j - 1]); printf("%d %d",f[1][n],sum[n] - f[1][n]);}

 

转载于:https://www.cnblogs.com/LM-LBG/p/10048200.html

你可能感兴趣的文章
Mvvm简介
查看>>
云态势感知产品 - 沙箱高级威胁检测
查看>>
Window配置Redis环境和简单使用
查看>>
asp.net正则匹配嵌套Html标签
查看>>
mybatis表关联一对多
查看>>
Amazon RDS 上的 Microsoft SQL Server » 导入和导出 SQL Server 数据库
查看>>
微信小程序——时间戳的转换及调用
查看>>
【RS】Modeling User Exposure in Recommendation - 在推荐中建模用户的暴露程度
查看>>
Kibana5.6安装
查看>>
Java多线程-线程池ThreadPoolExecutor构造方法和规则
查看>>
Solr字段类型field type的定义
查看>>
CentOS6.4下编译安装Apache2.4+PHP5.6
查看>>
Atitit. Xss 漏洞的原理and应用xss木马
查看>>
Spring使用facotry-method创建单例Bean总结<转>
查看>>
eclipse中英文版转换(前提:有中文包)
查看>>
当你纠结时,请打开这31个锦…
查看>>
怎样将runlmbench 获取的数值传给上层app
查看>>
Eclipse 使用maven创建Dynamic Web Project
查看>>
Python学习笔记——迭代器(RandSeq和AnyIter)
查看>>
MySQL索引使用方法和性能优化
查看>>