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

区间dp,合并石子模板题

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

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

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

例如有 44 堆石子分别为 1 3 5 2, 我们可以先合并 1、2堆,代价为 44,得到 4 5 2, 又合并 1、2堆,代价为 9,得到 9 2 ,再合并得到 11,总代价为 4+9+11=24;

如果第二步是先合并 2、3堆,则代价为 7,得到 4 7,最后一次合并代价为 11,总代价为 4+7+11=22

问题是:找出一种合理的方法,使总的代价最小,输出最小代价。

输入格式

第一行一个数 N 表示石子的堆数 N。

第二行 N 个数,表示每堆石子的质量(均不超过 1000)。

输出格式

输出一个整数,表示最小代价。

数据范围

1≤N≤300

输入样例:

4
1 3 5 2

输出样例:

22
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
const int N = 300 + 5;
const int INF = 1e9;
int n;
int sum[N], dp[N][N];int main() {cin >> n;for (int i = 1; i <= n; i++) {scanf("%d", &sum[i]);sum[i] += sum[i - 1];}for (int len = 2; len <= n; len++) {for (int l = 1; l + len - 1 <= n; l++) {int r = len + l - 1;dp[l][r] = INF;for (int k = l; k < r; k++) {dp[l][r] = min(dp[l][r], dp[l][k] + dp[k + 1][r] + sum[r] - sum[l - 1]);}}}cout << dp[1][n] << endl;return 0;
}

代码2

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
const int N = 300 + 5;
const int INF = 1e9;
int n;
LL sum[N], dp[N][N];int main() {cin >> n;for (int i = 1; i <= n; i++) {scanf("%ld", &sum[i]);sum[i] += sum[i - 1];}for (int i = n; i >= 1; i--) {for (int j = i + 1; j <= n; j++) {dp[i][j] = INF;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]);}}}cout << dp[1][n] << endl;return 0;
}

 

http://www.lryc.cn/news/101066.html

相关文章:

  • C++代码格式化工具clang-format详细介绍
  • CentOS 7安装PostgreSQL 15版本数据库
  • QGraphicsView实现简易地图2『瓦片经纬度』
  • 医学图像重建—第一章笔记
  • python-pytorch基础之神经网络分类
  • 【C++ 程序设计】实战:C++ 变量实践练习题
  • 微软对Visual Studio 17.7 Preview 4进行版本更新,新插件管理器亮相
  • Kafka 入门到起飞 - Kafka怎么做到保障消息不会重复消费的? 消费者组是什么?
  • MongoDB 的增、查、改、删
  • mysql常用操作命令
  • 数学建模常见模型汇总
  • C#使用LINQ查询操作符实例代码(二)
  • jenkinsfile小试牛刀
  • C++ xmake构建
  • 推荐带500创作模型的付费创作V2.1.0独立版系统源码
  • wps图表怎么改横纵坐标,MLP 多层感知器和CNN卷积神经网络区别
  • rdb和aof
  • TCP网络通信编程之网络上传文件
  • Java中对Redis的常用操作
  • 链路追踪设计
  • Golang之路---02 基础语法——常量 (包括特殊常量iota)
  • Pytest学习教程_装饰器(二)
  • redis的如何使用
  • MyBatis(二)
  • 【【51单片机AD转换模块】】
  • Longest Divisors Interval(cf)
  • 配置文件、request对象请求方法、Django连接MySQL、Django中的ORM、ORM增删改查字段、ORM增删改查数据
  • CTF学习路线指南(附刷题练习网址)
  • 【Rust 基础篇】Rust默认泛型参数:简化泛型使用
  • 从源码分析Handler面试问题