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

Input
每组数据第1行为一个正整数N(2<=N<=100),以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1<=i<=N)。

Output

对于每组数据输出一个正整数,即最小得分

Sample Input
7
13
7
8
16
21
4
18

Sample Output

239

解题过程

这道题老师讲过所以很快就Ok了(其实主要是看书),首先在书上找出求出动态转移方程,我们可以用f[i][j]表示从i到j堆石头的最优解。

然后用s[i][j]表示从i-j石子堆的和。优化一下可以用s[i]表示前i堆的和,让后s[j]-s[i-1]就可以做到s[i][j]的效果。

在枚举一个k表示从i-j的第k个开始分,就可以求出来了。

然后动态转移方程:f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1])

代码

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,x,s[101],f[101][101];
int main()
{
  scanf("%d",&n);
  for (int i=1;i<=n;i++)
  {
    scanf("%d",&x);
    s[i]=s[i-1]+x;//s[i]表示前i堆的总和
  }
  memset(f,127/3,sizeof(f));//给f赋值一个很大的数

  for (int i=1;i<=n;i++) f[i][i]=0;//预处理
    for (int i=n-1;i>=1;i--)//从n-1开始枚举头
      for (int j=i+1;j<=n;j++)//这样枚举可以从少堆的开始枚举
        for (int k=i;k<=j-1;k++)//枚举分裂点
          f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);

  //动态转移方程
  printf("%d\n",f[1][n]);//输出从1-n堆最优解
}

ssl2863-石子合并【dp练习】相关推荐

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

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

  2. 算法基础课-动态规划-区间dp-AcWing 282. 石子合并:区间dp

    文章目录 题目分析 题目链接 题目分析 只能合并相邻两堆.求体力最小值 数据比较弱,最多300堆,每堆重量不超过1000. 状态表示 f[i][j]表示合并区间[i,j]需要的最小体力 状态转移 把区 ...

  3. SDNU 1048.石子合并2(区间dp)

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

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

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

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

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

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

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

  7. AcWing.282石子合并(区间DP)题解

    石子合并 题目描述 设有N堆石子排成一排,其编号为1,2,3,-,N. 每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆. 每次只能合并相邻的两堆,合并的代价为这两堆石子的质 ...

  8. 区间DP之环形石子合并

    环形石子合并 题目传送门 题目描述 将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆. 规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分. 请编写一个程序,读入堆 ...

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

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

  10. 石子合并——最经典的dp问题

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

最新文章

  1. 【Caffe实践】 多目标输出探究
  2. 02.规划过程组表格-需求管理计划
  3. 在WinCE 6.0系统下实现USB功能定制
  4. Codeforces 55D Beautiful numbers (数位DP)
  5. 关于使用pietty或putty终端连接ubuntu虚拟机时报被拒绝连接问题
  6. 大动作!华为海思注册资本从6亿增加到20亿
  7. STM32,你了解多少?(转载)
  8. Nagios 监控redis
  9. 加州理工学院公开课:机器学习与数据挖掘_神经网络
  10. 微软 .NET 团队宣布 Visual Basic 停止更新,VB 编程即将谢幕
  11. 当当网价格系统架构分析
  12. cron在线生成表达式
  13. Excel 如何锁定表头
  14. 高并发场景设计与解决方案
  15. Discuz X 多页面专题制作教程
  16. Deep Learning学习笔记(5)——AlphaGo
  17. python交互数据_Python用户交互以及数据类型
  18. 华为云CDN加速服务:让你体验不一样的云提速
  19. 我,新媒体运营,却连语文都没考及格!
  20. 小白零基础教学:用自助BI工具搭建领导驾驶舱

热门文章

  1. linux编程两个子进程,Linux中fork同时创建多个子进程的方法
  2. es6添加删除class_es6中class类的使用
  3. php绘制饼图,php怎么绘制饼图?
  4. java语言怎样判断文件夹_JAVA语言之如何判断文件,判断文件夹是否存在的代码...
  5. [Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value
  6. [设计模式]抽象工厂模式
  7. LeetCode 82 删除排序链表中的重复元素||-中等
  8. AcWing 312. 乌龟棋
  9. Circle and Points POJ - 1981(单位圆覆盖最多点)
  10. 数据结构与索引-- B+树索引