石子合并三大题型

  1. 任意两堆石子合并,直接手写一个小根堆,每次取前面两个相加,得到的值继续放入优先队列中,直到里面只有一个元素就输出
  2. 只能合并相邻两堆石子,这就类似于矩阵连乘(传送门),不过还是有一些差别
  3. 在2的基础上,这些石子形成一个环形,这又是一种新的题型

今天记录的是第二种——区间dp

题目描述
在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。例如:输入{1,2,3,4,5},输出33。【3+6+9+15=33】
输入
本题应该处理到文件尾,每组输入包括两行,第一行为石子堆的个数n,第二行则为每堆石子的个数。
输出
输出最小花费。
样例输入
5
1 2 3 4 5
样例输出
33

ps:

首先分析一下这个题目,举个例子,如果只有三堆 4 , 5 , 9
我们合并这三堆所花费的来自三部分

  • 第一二堆合并的花费
  • 第一二堆石子的个数和
  • 第三堆石子的数量
  • 那么就是4+5+9+6=24

但是这个题目要求的是相邻两堆之间合并,如果又很多堆石子,那么我们就要去找断点,最优值问题就是一个个最优子结构,所以我们需要一个一个去找断点,算出每一个最优子结构,然后相加

转移方程如下


此外我们需要引入一个数组,来记录石子的数量,可以利用前缀和思想,也可以直接存储第i到第j石子的数量


前缀优化

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e3 + 5;
int a[maxn], b[maxn], dp[maxn][maxn];
int main()
{int n;while (~scanf("%d", &n)){memset(dp, 0, sizeof(dp));for (int i = 1; i <= n; ++i)scanf("%d", &a[i]), b[i] = b[i - 1] + a[i]; //b数组求前缀for (int l = 2; l <= n; ++l){for (int i = 1; i + l - 1 <= n; ++i){int j = i + l - 1;dp[i][j] = inf;int x = b[j] - b[i - 1]; //i到j区间的石子数for (int k = i; k < j; ++k){dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + x);}}}printf("%d\n", dp[1][n]);}return 0;
}

利用数组存取石子的数量,和矩阵相乘类似,只是把乘换成加了

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
//#define inf 1<<20
const int maxn = 210;
int n, a[maxn];
int dp[maxn][maxn];  //dp[i][j]表示从第i堆到第j堆合并的代价
int sum[maxn][maxn]; //表示石头的数量
int main()
{while (cin >> n){for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++)sum[i][i] = a[i], dp[i][i] = 0;for (int len = 2; len <= n; len++){ //区间长度for (int i = 1; i + len - 1 <= n; i++){                        //区间起点int j = i + len - 1; //区间终点dp[i][j] = inf;for (int k = i; k <= j; k++) //用k来表示分割区间{sum[i][j] = sum[i][k] + sum[k + 1][j];dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j]);}}}cout << dp[1][n] << endl;}return 0;
}
人生如一场修行,得意时, 一日看尽长安花,艰难时,潦倒新停浊酒杯,但生命的跋涉不能回头,哪怕,畏涂巉岩不可攀,也要会当临绝顶,哪怕无人会登临意,也要猛志固常在,从经典中汲取九万里风鹏正举的力量,历练也无风雨也无晴的豁然,待到重阳日,我们还来就菊花。

若干年看到这些图片不知会作何感想





石子合并——最经典的dp问题相关推荐

  1. AcWing 1068. 环形石子合并(环形区间DP)

    AcWing 1068. 环形石子合并(环形区间DP) 一.问题 二.思路 三.代码 一.问题 二.思路 在讲解这道题之前,我们需要先掌握线性的区间DP问题,如果对于线性区间DP的解决方式还不了解的话 ...

  2. SDNU 1045.石子合并1(区间dp)

    Description 有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...

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

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

  4. 石子合并简化版(区间DP)

    题目链接 https://www.acwing.com/problem/content/284/ 思路 因为只能合并相邻的两堆石子,并且首位不构成环,那么我们用f[i][j]f[i][j]f[i][j ...

  5. 石子合并问题(no circle)

    算法实现题 3-5 石子合并问题(区间DP) 题目地址 题目描述: 桌面上从左到右放着 n(1≤n≤200) 堆石子,其中第 i堆石子包含的石子数量为 ai 现在要将石子有序地合并成一堆. 规定每次只 ...

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

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

  7. 动态规划 —— 区间 DP —— 石子合并三讲

    石子合并问题是最经典的 DP 问题,其有如下3种题型: [任意合并] 1.问题: 有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量.求 ...

  8. Nyoj 737: 石子合并(一)(区间DP+四边形优化)

    石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆 ...

  9. CSP认证201612-4 压缩编码[C++题解]:区间dp、huffman树、石子合并

    题目分析 来源:acwing 分析: 本题难在想到是区间dp.想到区间dp之后,这就是石子合并的代码直接默写. 那么是如何建模的呢?我们把huffman编码(这里要求按照字典序大小编码,和huffma ...

最新文章

  1. 2022-2028年中国无菌手套产业发展动态及投资趋势预测报告
  2. 综合布线工作组2008年上半年技术课题工作安排会议通知
  3. leetcode算法题--除数博弈★
  4. Windows下批量删除svn配置文件夹.svn
  5. ai 中 统计_AI统计(第2部分)
  6. js正则函数match、exec、test、search、replace、split使用集合
  7. OSGI嵌入tomcat应用服务器(gem-web)——资源下载
  8. 一个桌面系统的微信公众号开发
  9. 菜鸟打印助手接口_打印快递单,这4件事儿你非做不可
  10. EasyAR WebAR 开发微信小程序记录
  11. Why Service Mesh
  12. 个人企业征信体系介绍
  13. java-php-python-宠物救助网站的设计与实现计算机毕业设计
  14. 2020牛客寒假算法基础集训营3 B 牛牛的DRB迷宫II二进制详解
  15. 201809 CCF
  16. Mac电脑使用:隐藏苹果电脑桌面的硬盘图标
  17. 云锁 php一句话,关于php一句话免杀的分析转载
  18. VUE弹窗加载另一个VUE页面
  19. unity文字逐个出现实现文字打印机效果-Text
  20. 用74ls90及少量器件制作电子时钟

热门文章

  1. 音视频处理 C语言编译器
  2. 《NLTK基础教程》读书笔记 006期
  3. 读过的laravel文章
  4. 安卓java 模拟点击类_Android模拟用户点击的实现方法
  5. 淘宝系统 B2C电子商务系统UML建模 范例
  6. 窗口函数_LAG()与LEAD() 详解
  7. 可汗学院统计学 task 3
  8. 关于mask蒙尘效果触发
  9. 商务手机最大突破是打破墨守成规的工作方式
  10. 太空射击第15课: 道具