题目链接

题目

题目描述

将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. linux 服务器运行jmeter 进行服务性能压测

    本文为博主原创,转载请注明出处: 起初需要了解项目服务的性能和瓶颈,就想要用 jmeter 进行压测,刚开始都是启动本地的jmeter 压测服务器上项目服务的性能,发现服务器的 cpu 和内存等一直升 ...

  2. zipkin 与 sleuth 实现链路追踪

    本文为博主原创,转载请注明出处 1.Zipkin 与 Sleuth 简介 zipkin 的官网地址: https://zipkin.io/ Zipkin 和 Sleuth 都是由 Twitter 开源 ...

  3. 修改Keil uvison4 字体样式

    1.点击扳手配置 2.点击Colors & Fonts,选择其中的8051:Editor C Files,选择Text,点击右侧的Courier New... 3.在里面就可以调节字体了

  4. 有了Composition API后,有些场景或许你不需要pinia了

    前言 日常开发时有些业务场景功能很复杂,如果将所有代码都写在一个vue组件中,那个vue文件的代码量可能就几千行了,维护极其困难.这时我们就需要将其拆分为多个组件,拆完组件后就需要在不同组件间共享数据 ...

  5. Python学习之八_调用Outlook发送邮件以及调用远程windows上面的python

    Python学习之八_调用Outlook发送邮件以及调用远程windows上面的python 摘要 之前只有一个需求是发送加密邮件. 之前一直是使用linux进行发送.但是总是无法发送加密邮件. 最近 ...

  6. [转帖]【redis】redis各稳定版本特性(更新到6.0版本)

    1.Redis2.6 Redis2.6在2012年正是发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性如下: 1)服务端支持Lua脚本. 2)去掉虚拟内存相关功能. 3)放 ...

  7. Linux 通过yum 方式离线下载依赖rpm包的操作步骤

    离线下载依赖rpm包的方法 1.简单获取依赖关系 yum deplist rpm-build 注意 deplist 为依赖项目 我在arm 上面简单跑一下结果为 package: rpm-build- ...

  8. React Hooks 指北

    前言 这篇文章旨在总结 React Hooks 的使用技巧以及在使用过程中需要注意的问题,其中会附加一些问题产生的原因以及解决方式.但是请注意,文章中所给出的解决方式并不一定完全适用,解决问题的方案有 ...

  9. vue 半场动画进入状态

    <style> .box{ width: 30px; height: 30px; border-radius: 50%; background: red; } </style> ...

  10. 【一个小发现】VictoriaMetrics 中 vmselect 的 `-search.denyPartialResponse` 选项不应该开启

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 一直以为vmselect 的 -search.denyPa ...