题目链接

题目

题目描述

将n堆石子绕圆形操场排放,现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分。

请编写一个程序,读入堆数n及每堆的石子数,并进行如下计算:

  1. ​ 选择一种合并石子的方案,使得做n-1次合并得分总和最大。
  2. ​ 选择一种合并石子的方案,使得做n-1次合并得分总和最小。

输入描述

输入第一行一个整数n,表示有n堆石子。

第二行n个整数,表示每堆石子的数量。

输出描述

第一行为合并得分总和最小值,

第二行为合并得分总和最大值。

示例1

输入

4
4 5 9 4

输出

43
54

备注

对于\(100 \%\) 的数据,有 \(1 \leq n \leq 200\) 。

题解

知识点:区间dp。

普通的石子合并用区间dp直接能做,但这里是环形的,有两种处理方式,比较简单的是复制一段接在后面,就可以做了。

如果是线性dp的环形处理可以做两次dp,一次是强制断开的情况,一次是强制链接的情况。

可以用前缀和优化求和。

时间复杂度 \(O(n^3)\)

空间复杂度 \(O(n^2)\)

代码

#include <bits/stdc++.h>

using namespace std;

int sum[407], dp[407][407];///循环,端点开大一倍

int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> sum[i], sum[i + n] = sum[i];
for (int i = 1;i <= 2 * n;i++) sum[i] += sum[i - 1]; memset(dp, 0x3f, sizeof(dp));
for (int i = 1;i <= 2 * n;i++) dp[i][i] = 0;
for (int l = 2;l <= n;l++) {///算到长度为n
for (int i = 1;i <= 2 * n;i++) {///搞循环,因为分割区间可能到加长的区间,因此大于n的区间也要算
int j = i + l - 1;
for (int k = i;k < j;k++)
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
}
}
int ans = ~(1 << 31);
for (int i = 1;i <= n;i++) ans = min(ans, dp[i][i + n - 1]);
cout << ans << '\n'; memset(dp, 0, sizeof(dp));
for (int l = 2;l <= n;l++) {
for (int i = 1;i <= 2 * n;i++) {///搞循环
int j = i + l - 1;
for (int k = i;k < j;k++)
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
}
}
ans = 0;
for (int i = 1;i <= n;i++) ans = max(ans, dp[i][i + n - 1]);
cout << ans << '\n';
return 0;
}

NC50493 石子合并的更多相关文章

  1. RQNOJ 490 环形石子合并

    题目链接:https://www.rqnoj.cn/problem/490 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一 ...

  2. codevs1048 石子合并

    题目链接:http://codevs.cn/problem/1048/ 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代 ...

  3. 石子合并[DP-N3]

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

  4. 51Nod 1021 石子合并 Label:Water DP

    N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价.   例如: 1 2 3 4,有 ...

  5. BZOJ 3229: [Sdoi2008]石子合并

    3229: [Sdoi2008]石子合并 时间限制: 3 Sec  内存限制: 128 MB提交: 497  解决: 240[提交][][] 题目描述 在一个操场上摆放着一排N堆石子.现要将石子有次序 ...

  6. nyoj 737 石子合并(一)。区间dp

    http://acm.nyist.net/JudgeOnline/problem.php?pid=737 数据很小,适合区间dp的入门 对于第[i, j]堆,无论你怎么合并,无论你先选哪两堆结合,当你 ...

  7. BZOJ-3229 石子合并 GarsiaWachs算法

    经典DP?稳T 3229: [Sdoi2008]石子合并 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 426 Solved: 202 [Submit] ...

  8. BZOJ3229 石子合并

    Description 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将N堆石 ...

  9. [NYIST737]石子合并(一)(区间dp)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 很经典的区间dp,发现没有写过题解.最近被hihocoder上几道比赛题难住了 ...

  10. [luogu 1880]石子合并

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

随机推荐

  1. Feign 实现微服务调用及进行服务熔断与降级

    本文为博主原创,未经允许不得转载: 1. Feign 日志级别配置 2. Feign client 封装调用 3. Feign 定义熔断降级方法 4. 通过 FallbackFactory 工厂 实现 ...

  2. Https 原理与工作流程及证书链校验

    本文为博主原创,未经允许不得转载: 目录 HTTP传输三大风险 安全通信原则 HTTPS定义 TLS/SSL 协议及加密算法 HTTPS工作流程 HTTPS协议和HTTP协议的区别 CA机构 证书链校 ...

  3. 配置Maven项目的pom.xml时遇到input contained no data问题

    1.问题 2.解决 我发现每次当我修改一些部分之后,就会遇到这个问题 我遵循了他的建议重新排列标记属性,然后重新加载就解决了报错 个人怀疑是修改后并没有识别之类的? 最终原因:是我在Maven项目中的 ...

  4. 【MicroPython】用 c 添加接口 -- 框架介绍

    [来源]https://www.eemaker.com/micropython-c-kuangjia.html

  5. [js] - 为子节点增加鼠标移入和移出的样式

    var cards = document.querySelectorAll(".card"); for (let index = 0; index < cards.lengt ...

  6. JS逆向实战27——pdd的anti_content 分析与逆向

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 本文已在微信公众号发布 目 ...

  7. [转帖]Linux 性能监控 Sar (Sysstat) 示例

    https://bbs.huaweicloud.com/blogs/345343#   [摘要] 使用 sar,您可以实时监控各种 Linux 子系统(CPU.内存.I/O..)的性能,还可以持续收集 ...

  8. [转帖]HTTP X-Forwarded-For 介绍

    https://www.runoob.com/w3cnote/http-x-forwarded-for.html X-Forwarded-For 是一个 HTTP 扩展头部.HTTP/1.1(RFC ...

  9. [转帖]聊聊hikari连接池的leakDetectionThreshold

    http://www.manongjc.com/detail/52-hjoufmsfhtsqvgp.html 本文章向大家介绍聊聊hikari连接池的leakDetectionThreshold,主要 ...

  10. [转帖]linux查看端口及端口详解

    https://www.cnblogs.com/the-tops/p/6126941.html   今天现场查看了TCP端口的占用情况,如下图   红色部分是IP,现场那边问我是不是我的程序占用了tc ...