P1880 [NOI1995] 石子合并

【题目网站】

[NOI1995] 石子合并 - 洛谷

【题目考点】

区间动态规划

【题目思路】

  1. 输入数组,把长度翻倍
  2. 初始化最小值数组
  3. 一个一个区间地填
  4. 找出最大值与最小值
  5. 输出答案

【思路讲解】

(加粗的为重点)

区间动态规划就是动态规划的升级版,表示数组的每一个值表示一个区间的和或差或其他的。

区间动态规划的思路和动态规划一样,都是先把小区间的值求出来,再慢慢地求出最终区间。

所以,我们可以借助一个表格来梳理题目信息(i表示区间起点,j表示区间终点)

因为题目说石子堆是围成一个圆形,所以我把表格的i翻倍。但因为j上下都一样,这里就不翻倍。i也只到7,原因也是重复了。

(这里我演示最大值,最小值思路几乎一样)n = 4(竖着的为i,横着
的为j)

0 1 2 3 4 5 6 7
1
2
3
4

因为有些格子是没有分数的,比如说i=1,j=1,所以我们就把这些格子设置成0。

0 1 2 3 4 5 6 7
1 0
2 0
3 0
4 0

我们先来看i=1,j=2的格子。

因为起点是1,终点是2,所以我们要设一个断点,段成两段子堆(也就是历史得分),再将其相加后再加上题目信息中的第1个和第2个,就成了。(要和自己比一下谁大,填大的哪个,因为这里初始都是0,所以忽略了这一步)

因为断点只有一个,所以算式为(4 + 5)+ 0 + 0 = 9。

0 1 2 3 4 5 6 7
1 0 9
2 0
3 0
4 0

按照这个公式,我们可以填出很多格子。

0 1 2 3 4 5 6 7
1 0 9
2 0 14
3 0 13
4 0 8

现在,我们要填的就应该是i=1,j=3了。

但是,按照上面的公式解决不了这个空格,会发现有两种情况:一种是i=1,j=2加上i=3,j=3;另一种是i=1,j=1加上i=2,j=3。所以我们把两种情况分别算出来,比一下大小就行了。最终发现第2种情况更大。再加上题目数据的第1-3个就好了,算出来是32。

0 1 2 3 4 5 6 7
1 0 9 32
2 0 14
3 0 13
4 0 8

以此类推,又能填出一斜排格子。

0 1 2 3 4 5 6 7
1 0 9 32
2 0 14 32
3 0 13 30
4 0 8 22

接下来是i=1,j=4。思路一样,不同的是要分成三种情况,就不一一算了,我填出来,看一看你填得对不对

0 1 2 3 4 5 6 7
1 0 9 32 54
2 0 14 32 54
3 0 13 30 52
4 0 8 22 54

最后,我们再把54,54,52和54比较一下大小,最后可以得出最大的是54,就可以输出答案了。

【题目答案】

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
const long long N = 105 * 4;int s[N][N], b[N][N], n, dp[N], fmax, fmin = 9999999;int sum(int a, int c){int s = 0;for (int i = a; i <= c; i++){s += dp[i];}return s;
}int main(){cin >> n;for (int i = 1; i <= n; i++){cin >> dp[i];dp[i + n] = dp[i];}for (int i = 1; i < N; i++){for (int j = 1; j < N; j++){if (i - j != 0){s[i][j] = 9999999;}}}for (int l = 2; l <= n; l++){for (int i = 1; i <= n * 2; i++){int j = i + l - 1;for (int k = i; k < j; k++){b[i][j] = max(b[i][j], sum(i, j) + b[i][k] + b[k + 1][j]);s[i][j] = min(s[i][j], sum(i, j) + s[i][k] + s[k + 1][j]);}}}for (int i = 1; i <= n; i++){int j = n + i - 1;fmax = max(fmax, b[i][j]);fmin = min(fmin, s[i][j]);}cout << fmin << endl << fmax << endl;return 0;
} 

【常见错误】

  1. 第21行,忘记数组翻倍
  2. 第25行,忘记把斜排归零

【相关题目】

P1063

(如有错误请及时通知,我会第一时间修改)

P1880 [NOI1995] 石子合并 的详解相关推荐

  1. 区间DP初探 P1880 [NOI1995]石子合并

    https://www.luogu.org/problemnew/show/P1880 区间dp,顾名思义,是以区间为阶段的一种线性dp的拓展 状态常定义为$f[i][j]$,表示区间[i,j]的某种 ...

  2. P1880 [NOI1995]石子合并

    蒟蒻做NOI系列的题,好慌...... 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...

  3. 洛谷P1880 [NOI1995]石子合并

    放题解 题目传送门 放代码 转载于:https://www.cnblogs.com/liuyuxinblog/p/10799085.html

  4. luogu P1880 [NOI1995]石子合并

    咕咕咕 说好把济南集训时做的题写写题解还是鸽了然后因为太无聊又来续上了w 传送门~xiu 一道dp 具体是啥dp呢我去看看题解咋说 嗯 区间dp(跟我想的一样 把环拆成链来做 n的范围比较小就直接枚举 ...

  5. [NOI1995]石子合并

    题目描述: 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成 ...

  6. 减少HTTP请求之合并图片详解(大型网站优化技术)

    一.相关知识讲解 看过雅虎的前端优化35条建议,都知道优化前端是有多么重要.页面的加载速度直接影响到用户的体验.80%的终端用户响应时间都花在了前端上,其中大部分时间都在下载页面上的各种组件:图片,样 ...

  7. java 输入流可以合并吗_Java 使用IO流实现大文件的分割与合并实例详解

    java 使用IO流实现大文件的分割与合并 文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时 ...

  8. Word邮件合并功能详解:合并后生成多个word文档,删除空白页

    Word邮件合并功能详解:合并后生成多个word文档,删除空白页 最近在实习,干了很多打杂得工作,所以office软件用的很多很多,瞬间觉得自己可以去裸考计算机二级了哈哈哈哈哈哈.今天因为工作用到了邮 ...

  9. 站长在线Python精讲:在Python中使用split()方法分割、使用join()方法合并字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用split()方法分割.使用join()方法合并字符串详解>.本知识点主要内容有:在Python中使用s ...

最新文章

  1. EDIUS新建项目工程设置
  2. SpringMVC杂记
  3. mysql删除表命令_MySQL创建和删除表操作命令实例讲解
  4. MySQL 遇到的问题
  5. java枚举类是什么_Java学习--常用类(2)、Math类、枚举类
  6. php oauth 扩展,PHP 安装 Oauth 扩展
  7. 《JavaScript机器人编程指南》——1.2 NodeBot是什么,基本词汇还有哪些
  8. 云服务器 生物信息学,云服务器 生物信息学
  9. element 日期控件 限制开始日期和结束日期
  10. [目标检测]YOLO原理
  11. mac下安装node.js步骤
  12. oracle-约束-序列
  13. OCR应用场景:票总管发票管理系统
  14. RTMP协议 和 HLS 协议
  15. 社区发现算法————总结
  16. 北京大学历届学生名单 计算机,北京大学历史系历届学生名单
  17. 点云可视化——实时显示点云流
  18. Linux文件裸写,Linux下使用裸設備作為數據文件
  19. 经典DP题目-滑雪问题
  20. 系统介绍一部手机开发的全流程

热门文章

  1. git强行覆盖本地代码内容(以服务器代码为主)
  2. Quic协议与DNS
  3. spring boot 动态数据源
  4. 计算机应用2003页眉和页脚,《设置页面格式、页眉和页脚》教案
  5. Transformer结构解析(附源代码)
  6. 2022-9-19作业,按键中断相关实验(包括串口,红外感应,光电,火焰)
  7. 传统方法-3D人脸识别
  8. 统计每个数字出现的次数。
  9. 计算机电源第二个接口,后果很严重!! 电源接口别搞错
  10. V 2 heartbeat V2(HA)