题目链接: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:

 1 // state expression:
 2 // dp[i][j] = max wealth
 3 // i: start pos
 4 // j: len of present section
 5 //
 6 // find the answer:
 7 // dp[1][n]
 8 //
 9 // transferring:
10 // dp[i][j] = sum(i,i+j-1) - min(dp[i][j-1], dp[i+1][j-1])
11 //
12 // boundary:
13 // dp[i][1] = w[i]
14 #include <iostream>
15 #include <stdio.h>
16 #include <string.h>
17 #define MAX_N 5005
18
19 using namespace std;
20
21 int n;
22 int w[MAX_N];
23 int dp[MAX_N];
24 int sum[MAX_N];
25
26 void read()
27 {
28     cin>>n;
29     for(int i=1;i<=n;i++)
30     {
31         cin>>w[i];
32     }
33 }
34
35 void cal_sum()
36 {
37     sum[0]=0;
38     for(int i=1;i<=n;i++)
39     {
40         sum[i]=sum[i-1]+w[i];
41     }
42 }
43
44 void solve()
45 {
46     cal_sum();
47     for(int j=1;j<=n;j++)
48     {
49         for(int i=1;i<=n;i++)
50         {
51             if(j==1) dp[i]=w[i];
52             else dp[i]=sum[i+j-1]-sum[i-1]-min(dp[i],dp[i+1]);
53         }
54     }
55 }
56
57 void print()
58 {
59     cout<<dp[1]<<endl;
60 }
61
62 int main()
63 {
64     read();
65     solve();
66     print();
67 }

转载于:https://www.cnblogs.com/Leohh/p/7629846.html

BZOJ 2101 [Usaco2010 Dec]Treasure Chest 藏宝箱:区间dp 博弈【两种表示方法】【压维】...相关推荐

  1. bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱

    2101: [Usaco2010 Dec]Treasure Chest 藏宝箱 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 418  Solved: ...

  2. Uva12325 Zombie's Treasure Chest [二分区间+模拟退火]

    Zombie's Treasure Chest 题目链接 https://cn.vjudge.net/problem/UVA-12325 题意 两种物品无穷多个,第一种物品重量s1s_1s1​,价值v ...

  3. BZOJ 1032 JSOI 2007 祖码Zuma 区间DP

    题目大意:依照祖玛的玩法(任意选颜色),给出一段区间.问最少用多少个球可以把全部颜色块都消除. 思路:把输入数据依照连续的块处理.保存成颜色和数量.然后用这个来DP.我们知道,一个单独的块须要两个同样 ...

  4. bzoj 1260: [CQOI2007]涂色paint(区间DP)

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MB Submit: 1681  Solved: 1018 [Submit][ ...

  5. BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操

    [题意] 给出一棵树.现在可以在树中删去m条边,使它变成m+1棵树.要求最小化树的直径的最大值. [题解] 二分答案.$Check$的时候用$DP$,记录当前节点每个儿子的直径$v[i]$,如果$v[ ...

  6. bzoj 1032: [JSOI2007]祖码Zuma(区间DP)

    1032: [JSOI2007]祖码Zuma Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1094  Solved: 569 [Submit][S ...

  7. BZOJ 1778 [Usaco2010 Hol]Dotp 驱逐猪猡 ——期望DP

    思路和BZOJ 博物馆很像. 同样是高斯消元 #include <map> #include <ctime> #include <cmath> #include & ...

  8. BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元

    题目大意:给定一个无向图,炸弹从1号节点出发,每个时刻有P/Q的概率爆炸,如果某个时刻没有爆炸,就会等概率沿着随机一条出边走到下一个城市,求最终每个城市的爆炸概率 #include <cmath ...

  9. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】

    算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v]*(1-p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可( ...

  10. [AtCoder Grand Contest 048] D - Pocky Game(区间dp + 博弈)

    problem AtCoder solution 注意:本题不是平等博弈,因为先手只能取最左边,后手只能取最右边. 设 f[l][r][k]:f[l][r][k]:f[l][r][k]: 只剩下区间 ...

最新文章

  1. 每日一皮:当产品经理试图让程序员冷静下来的时候...
  2. 【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )
  3. 快速寻找满足条件的两个数
  4. wxWidgets:wxMediaCtr类用法
  5. 编写代码约定,每行字符长度不超过80列
  6. 合工大五套卷_2020合工大超越数一五套卷第一套感想
  7. 【Vscode】调试DotNet Core代码
  8. 大事件后台管理系统开发实战(中)
  9. JS 日期对象常用函数(时间常用函数、日期格式化)
  10. 户口所在地代码查询_毕业生如何查询档案存放地及存档问题?
  11. Java追加文本内容到txt文件
  12. Android集成百度语音识别API
  13. pythoon介绍、安装环境、基础知识、练习题
  14. 新版犀牛书该不该入手?
  15. 网站ping端口的操作方法和命令介绍
  16. iOS越狱设备安装Frida不成功
  17. php制作特效文字,PPT制作文字特效 PPT特效文字制作教程
  18. 追求技术之美:云计算开发者的自我修养
  19. Google Scholar特别好用的镜像网站链接
  20. 电脑桌面右下方点击失灵,其他桌面区域正常

热门文章

  1. 5.flask与数据库
  2. java后端getmonth_Java中的LocalDateTime getMonth()方法
  3. Python 多环境配置管理
  4. ubuntu中各个文件夹的作用
  5. pip 使用豆瓣镜像
  6. win10计算机升级系统,微软Win10升级助手
  7. 物无定味适口者珍,Python3并发场景(CPU密集/IO密集)任务的并发方式的场景抉择(多线程threading/多进程multiprocessing/协程asyncio)
  8. 计算机系统建模_包图
  9. 计算机 及其 应用系统
  10. Mysql索引结构全维度比较