当前位置: 首页 > news >正文

12 ACwing 282 石子合并 题解

石子合并

题面

设有 N 堆石子排成一排,其编号为 1,2,3,…,N。

每堆石子有一定的质量 \(a_i\) ,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。

每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。

\(1 \le N \le 300\)

\(0 \le a_i \le 1000\)

题解

这是区间 dp 板子,因为合并时只能合并相邻的两堆石子,所以每堆石子都可以用一个闭区间 \([l,r]\) 表示,而这个闭区间可以从 \([l,k]\)\([k + 1, r]\) 两个子区间转移过来,所以我们可以将区间长度 \(len\) 作为 “阶段” ,左端点和右端点就是状态,中间的 \(k\) 就是 “决策”

\(f(l,r)\) 为将 \([l,r]\) 合并为一堆石子的最小代价

转移 \(f(l,r) = min \{f(l,k) + f(k + 1, r)\} + sum(l,r)\)

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>using namespace std;typedef long long ll;const int N = 310;int n;
int a[N], sum[N], f[N][N];int main () {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];sum[i] = a[i] + sum[i - 1];}memset (f, 0x3f, sizeof f);for (int i = 1; i <= n; i++) {f[i][i] = 0;}for (int len = 2; len <= n; len ++) {for (int l = 1; l + len - 1 <= n; l ++) {int r = l + len - 1;for (int k = l; k < r; k ++) {f[l][r] = min (f[l][r], f[l][k] + f[k + 1][r]);}f[l][r] += sum[r] - sum[l - 1];}}cout << f[1][n] << endl;return 0;
}
http://www.hskmm.com/?act=detail&tid=25023

相关文章:

  • 11 ACwing 281 Coins 题解
  • 某中心科学家荣获多项计算机技术大奖
  • FFT
  • 4 ACwing 274 Mobile Service 题解
  • 3 ACwing 273 Making the Grade 题解
  • 1 ACwing 271 Mr
  • 2 ACwing 272 LCIS 最长公共上升子序列 题解
  • 用 Haxe 实现英文数字验证码识别
  • 出题四
  • 7 2025 07 15 模拟赛题解
  • 使用 OCaml 实现验证码识别
  • 私有云大数据部署:从开发到生产(Docker、K8s、HDFS/Flink on K8s) - 详解
  • 差分约束模板
  • 17 LCA模拟赛1T2 剧院始于演员 题解
  • 3 2025 04 23 模拟赛总结
  • 14 收心赛3 T1 最长不降子序列 题解
  • 16 LCA模拟赛1T1 密码 题解
  • 吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础(一)
  • 阿里开源规则引擎QLExpress
  • QOJ7411 Bitwise Xor
  • 完整教程:SOC-ESP32S3部分:25-HTTP请求
  • 为什么要采用“接口 - 抽象类 - 实现类”这种三层结构? - 浪矢
  • 对外提供 AI 服务的风险:合规视角与 AI 安全围栏落地指南
  • VScode C/C++ 汉化 竞赛版 只需下载扩展 (超简单)
  • 网络安全工具与社区讨论月报
  • 机器人运动未来与人机交互研究
  • 欧拉路径 欧拉图 小记
  • OI 笑传 #16
  • cf296b
  • 第一次使用Ttpora