BZOJ 2101 [Usaco2010 Dec]Treasure Chest 藏宝箱:区间dp 博弈【两种表示方法】【压维】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2101
题意:
共有n枚金币,第i枚金币的价值是w[i]。
把金币排成一条直线,Bessie和Bonny轮流取金币,看谁取到的钱最多。
Bessie先取,每次只能取一枚金币,而且只能选择取直线两头的金币,不能取走中间的金币。当所有金币取完之后,游戏就结束了。
Bessie和Bonny都是非常聪明的,她们会采用最好的办法让自己取到的金币最多。
请帮助Bessie计算一下,她能拿到多少钱?
题解:
区间dp共有两种表示状态的方法:
(1)dp[i][j]:表示区间[i,j]的答案。
一般转移为:dp[i][j] = best(dp[i+1][j], dp[i][j-1])
(2)dp[i][j]:左端点为i,区间长度为j。
一般转移为:dp[i][j] = best(dp[i][j-1], dp[i+1][j-1])
显然,第二种是可以压维的。因为dp[i][j]只与dp[...][j-1]有关。
在此题中,第一种表示会炸空间,所以只能用第二种。
表示状态:
dp[i][j] = max wealth
i:起点为i
j:区间长度为j
表示对于当前区间,先手的最大获利。
找出答案:
ans = dp[1][n]
表示整个区间。
如何转移:
对于一个区间,这个区间内的价值总和是一定的。
那么如果要让自己获利更大,就是要让对方接下来的获利最小。
自己的获利 = 区间价值总和 - 对方获利
即:dp[i][j] = sum(i,i+j-1) - min(dp[i][j-1], dp[i+1][j-1])
边界条件:
dp[i][1] = w[i]
只能拿走剩下的一个硬币。
优化:
压维。
前缀和。
AC Code:
// state expression:
// dp[i][j] = max wealth
// i: start pos
// j: len of present section
//
// find the answer:
// dp[1][n]
//
// transferring:
// dp[i][j] = sum(i,i+j-1) - min(dp[i][j-1], dp[i+1][j-1])
//
// boundary:
// dp[i][1] = w[i]
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 5005 using namespace std; int n;
int w[MAX_N];
int dp[MAX_N];
int sum[MAX_N]; void read()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>w[i];
}
} void cal_sum()
{
sum[]=;
for(int i=;i<=n;i++)
{
sum[i]=sum[i-]+w[i];
}
} void solve()
{
cal_sum();
for(int j=;j<=n;j++)
{
for(int i=;i<=n;i++)
{
if(j==) dp[i]=w[i];
else dp[i]=sum[i+j-]-sum[i-]-min(dp[i],dp[i+]);
}
}
} void print()
{
cout<<dp[]<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 2101 [Usaco2010 Dec]Treasure Chest 藏宝箱:区间dp 博弈【两种表示方法】【压维】的更多相关文章
- BZOJ 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱( dp )
dp( l , r ) = sum( l , r ) - min( dp( l + 1 , r ) , dp( l , r - 1 ) ) 被卡空间....我们可以发现 l > r 是无意义的 ...
- bzoj 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱【区间dp】
就是区间dp啦f[i][j]表示以i开头的长为j+1的一段的答案,转移是f[i][j]=s[i+l]-s[i-1]+min(f[i][j-1],f[i+1][j-1]),初始是f[i][1]=a[i] ...
- BZOJ——2101: [Usaco2010 Dec]Treasure Chest 藏宝箱
http://www.lydsy.com/JudgeOnline/problem.php?id=2101 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- 【BZOJ】2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2101 这个dp真是神思想orz 设状态f[i, j]表示i-j先手所拿最大值,注意,是先手 所以转移 ...
- BZOJ 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(这是我写过最骚气的dp!)
题目描述 贝西和邦妮找到了一个藏宝箱,里面都是金币! 但是身为两头牛,她们不能到商店里把金币换成好吃的东西,于是她们只能用这些金币来玩游戏了. 藏宝箱里一共有N枚金币,第i枚金币的价值是Ci.贝西 ...
- bzoj21012101: [Usaco2010 Dec]Treasure Chest 藏宝箱(滚动数组优化dp)
2101: [Usaco2010 Dec]Treasure Chest 藏宝箱 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 592 Solved: ...
- BZOJ2101: [Usaco2010 Dec]Treasure Chest 藏宝箱
2101: [Usaco2010 Dec]Treasure Chest 藏宝箱 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 327 Solved: ...
- [Usaco2010 Dec]Treasure Chest 藏宝箱
题目链接:点这里 Solution: 刚开始以为是博弈论,然而不是... 首先考虑n方dp,设f(l,r)为只有\(l\)到\(r\)区间的钱的先手最大获利 那么我们可以得到式子f(l,r)=sum( ...
- bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱
2101: [Usaco2010 Dec]Treasure Chest 藏宝箱 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 418 Solved: ...
随机推荐
- 通过apache,和nginx模块去除html中的空格和tab
最近一个项目中,合作方要求去除html中的空格,不想改代码,所以百度了一下通过apache,和nginx模块去除html中的空格和tab的方案,下面记录下来: 一.nginx nginx可以通过mod ...
- Android中的Telephony学习笔记(2)
上一篇文章中学习了android.provider中Telephony类. 这一篇文章学习android.telephony包中的类,这些类是android提供给上层调用的API. 为监測基本电话信息 ...
- intent传值传对象跳转
intent传值传对象跳转 1.传值 //原activity中存入一个字段 intent = new Intent(From.this, To.class); intent.putExtra(&quo ...
- Linux装mysqli.so
php 5.2.3+mysqli 安装与常见错误 总结 php 5.2.3+mysqli 安装与常见错误 总结 记得原来在编译php的已经已经加上参数--with-mysql=/usr/local ...
- js 原生方法获取所有兄弟节点
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- 面向对象在JavaScript中的接口实现
接口是面向对象编程的基础.它是一组包括了函数型方法的数据结构,与类一样.都是编程语言中比較抽象的概念.比方生活中的接口.机顶盒.人们利用它来实现收看不同频道和信号的节目,它宛如对不同类型的信息进行集合 ...
- linux 源代码安装mysql5.5
linux下源代码安装mysql过程例如以下: yum update yum upgrade yum install -y vim man wget yum install -y gcc gcc-c+ ...
- iBatis2 SqlMap中经常使用sql语句
本来我也不喜欢iBatis,那是由于我当时还不怎么会用它,如今我想说,iBatis是个好东西,不信你试试看.以下是我在项目实践中对iBatis的一个小总结.希望帮助众多在疲于iBatis编码而无暇思考 ...
- 现在有一张半径为r的圆桌,其中心位于(x,y),现在他想把圆桌的中心移到(x1,y1)。每次移动一步,都必须在圆桌边缘固定一个点然后将圆桌绕这个点旋转。问最少需要移动几步。
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<vector> ...
- 通过PHP获取文件创建与修改时间
1.获取文件创建时间示例: 1 2 $ctime=filectime("chinawinxp.txt"); echo "创建时间:".date("Y- ...