石子合并石子合并石子合并

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

解题方法:

这道题我们可以用两个方法来做,两种方法分别如下:

方法1:先枚举边界,再枚举中间的断点,将断点两边的分值加在一起,再加上当前的分值

#include<iostream>
using namespace std;
int main()
{int a[100],f[100][100],n,o;cin>>n;for (int i=1;i<=n;i++){cin>>o;a[i]=a[i-1]+o;//求前缀和} memset(f,127/3,sizeof(f));for (int i=1;i<=n;i++) f[i][i]=0;//清零for (int i=n-1;i>=1;i--)//枚举边界for (int j=i+1;j<=n;j++)//枚举边界for (int c=i;c<j;c++)//枚举断点f[i][j]=min(f[i][j],f[i][c]+f[c+1][j]+a[j]-a[i-1]);//状态转移方程cout<<f[1][n];
}

方法2: 先枚举长度,再枚举前面的边界和断点,后面的边界就是前面的边界+长度-1,以此类推,算出结果

#include<cstdio>
#include<iostream>
using namespace std;
int x,n,a[100],f[100][100];
int main()
{scanf("%d",&n);memset(f,127/3,sizeof(f));for (int i=1;i<=n;i++){scanf("%d",&x);a[i]=a[i-1]+x;//求前缀和f[i][i]=0;//清零}for (int i=2;i<=n;i++)//枚举长度for (int j=1;j<=n-i+1;j++)//枚举边界for (int k=j;k<=j+i-2;k++)//枚举断点f[j][i+j-1]=min(f[j][i+j-1],f[j][k]+f[k+1][j+i-1]+a[j+i-1]-a[j-1]);//状态转移方程printf("%d",f[1][n]);
}

【动态规划】石子合并相关推荐

  1. 算法分析 | 动态规划 | 石子合并问题

    一.问题描述 在一条直线上有n堆石子, 要求每次将相邻的两堆石子合成一堆,花费=两堆石子的总数 求最省总花费. 因为存在相邻的限制条件,不能使用贪心算法将每次最小的2堆合起来.遂使用动态规划 二.代码 ...

  2. 算法设计与分析——动态规划——石子合并问题

    1.石子合并问题 在一个圆形操场的四周摆放着n堆石子.现要将石子有序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.设计一个算法,计算出将n堆石子合并成 ...

  3. 石子合并(动态规划DP)

    时限: 1000ms 内存限制:10000K  总时限:3000ms 描述: 在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成 ...

  4. 动态规划经典题之石子合并

    题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分 试设计出1个算法,计算出将N堆石子合并成1堆 ...

  5. 石子合并问题java_动态规划求石子合并问题

    1.问题描述 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将n堆石子合 ...

  6. 租用游艇问题 石子合并问题 动态规划实验

    实验名称:动态规划 一.实验预习 1.实验目的 1. 理解并掌握动态规划方法的设计思想: 2. 提高应用动态规划方法解决问题和设计算法的能力: 3. 通过编程实现租用游艇问题和石子合并问题,进一步理解 ...

  7. 石子合并 动态规划(直线型)

    问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子合并成一堆的最小花费. 输入格式 输入第一行包含一个 ...

  8. 【动态规划】小石子游戏-石子合并

    题目 一群小孩子在玩小石子游戏,游戏有两种玩法. (1)路边玩法 有n堆石子堆放在路边,现要将石子有序地合并成一堆,规定每次只能移动相邻的两堆石子合并,合并花费为新合成的一堆石子的数量.求将这N堆石子 ...

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

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

  10. NYOJ737 石子合并(一)区间动态规划

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

最新文章

  1. 漫画 | 如果程序员的妈是产品经理,她会如何逼你结婚?
  2. windows下faster-rcnn遇到的检测框重复很多问题 nms
  3. pybind 回调 多线程 异常
  4. ubuntu 安装ImageMagic
  5. 用c语言读取和写入文件数据
  6. Django从理论到实战(part6)--关于DEBUG
  7. sdut 汉诺塔系列2
  8. 写给大数据从业者:数据科学的5个陷阱与缺陷
  9. dedecms进入mysql后台_DEDECMS 爆严重安全漏洞 免账号密码直接进入后台
  10. 【消息轰炸】Python消息轰炸
  11. 如何修改计算机mac,超简单的电脑mac地址查看和修改方法
  12. Blender 投影切割-删除重叠的平面
  13. Finalize、dispose、dispose(bool disposing)
  14. BTTCOJ 问题 C: 逃离机场 广度优先搜索
  15. 统计-均匀分布生成其他分布的两种方法
  16. 基因表达式编程(GEP)自学 第【3】天 Python 实现
  17. Knex 使用日志输出构造的SQL语句
  18. 下载文件到本地解压压缩包出现文件损坏,报错问题已解决
  19. 非常详细的FastDFS整合springBoot教程-带文件下载地址
  20. Justified Jungle

热门文章

  1. 无法初始化java类_myeclip运行java程序不能初始化类 NoClassDefFoundError
  2. leetcode209. 长度最小的子数组(滑动窗口)
  3. 解决Java当中 用point 画图时背景颜色变成黑色问题
  4. 一般动态规划问题合集(Leetcode题解-Python语言)
  5. Java面向对象编程(基础部分)
  6. C++ 详解拷贝构造函数
  7. [C++STL]C++实现priority_queue容器适配器
  8. Codeforces Round #601 (Div. 2)
  9. 【POI2007】OSI-Axes of Symmetry【计算几何】【manacher】
  10. NEERC 17 G.The Great Wall