1、题目描述

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

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

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

例如有4堆石子分别为 1 3 5 2, 我们可以先合并1、2堆,代价为4,得到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≤3001≤N≤300

输入样例:

4
1 3 5 2

输出样例:

22

2、分析

3、代码

import java.io.*;
import java.util.*;public class Main{static int N = 310, M = 1010;static int[][] f = new int[N][N];static int[] g;static int[] s;public static void main(String[] args) {Scanner in = new Scanner(new InputStreamReader(System.in));int n = in.nextInt();g = new int[n + 1];s = new int[n + 1];for(int i = 1;i <= n;i ++) {g[i] = in.nextInt();s[i] = s[i-1] + g[i];}//区间dpfor(int len = 2;len <= n;len ++) { //枚举长度for(int i = 1;i + len -1 <= n;i ++) { //枚举左端点int j = i + len - 1;f[i][j] = Integer.MAX_VALUE;for(int k = i;k < j;k ++) f[i][j] = Math.min(f[i][j], f[i][k] + f[k+1][j] + s[j] - s[i-1]);}}System.out.println(f[1][n]);}
}

AcWing 石子合并相关推荐

  1. AcWing 1068. 环形石子合并

    AcWing 1068. 环形石子合并 题意: n堆石头围成一个圈,然后将相邻两堆合并成新的一堆,得分为新的一堆的石头数 问最高得分合最低得分 题解: 很简单,区间dp的模板题 和这个题一样 状态转移 ...

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

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

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

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

  4. 【动态规划dp】区间DP模板 Acwing 282. 石子合并 | P3205 [HNOI2010]合唱队

    区间DP 模板 282. 石子合并 #include<iostream> #include<cmath> #include<algorithm> #include& ...

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

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

  6. 石子合并[DP-N3]

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

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

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

  8. 51nod 1022 石子合并v2

    就是石子合并的数据范围变为了1e3 经典四边形优化区间dp const int N = 2e3 + 10; const long long inf = 1e18; long long dp[N][N] ...

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

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

最新文章

  1. 由“递归遍历二叉树”引发的思考
  2. 中小型企业如何选择服务器配置?
  3. 77. 组合016(回溯法)
  4. Java调用跟踪系统_Tracer:在分布式系统中的调用跟踪和日志相关
  5. OpenKruise - 云原生应用自动化引擎正式开源
  6. 数据库-MySQL中间的注释
  7. 一些老程序员不错的经验分享
  8. android 预优化oat_Android内存优化大盘点
  9. activemq中怎么知道推送消息是否成功_ActiveMQ入门
  10. 多元统计分析基于r课后答案_应用多元统计分析课后答案.doc
  11. 电脑蓝牙打电话-总结(篇外、虚拟声卡选型)
  12. android 单独设置APP语言
  13. 将两张图片合并成一个PDF,不收费
  14. h3c交换机划分vlan
  15. 第十六届中国研究生电子设计竞赛记录
  16. 第149篇 笔记-web3
  17. 学Python找工作你起码要会这些
  18. Apache的性能解读
  19. 腾讯99公益日-券券松鼠❤
  20. flask-sqlalchemy一对多 知了传课 flask web全栈开发实战 黄勇

热门文章

  1. DJI Mavic 2 AUTEL Evo无人机无线链路_射频_RF测试
  2. 塞纳商务车改装后让人爱不释手
  3. sass揭秘之@if,@for,@each
  4. win7下一台电脑3台显示器
  5. 微信创建小程序引入vantUI步骤
  6. 单代号网络 双代号网络 概念
  7. JAVA实现下载浏览器可以识别的TXT等文件。
  8. 伪随机序列与相关函数---钧桐肤浅而又消瘦的理解
  9. Nginx日志分析工具
  10. matlab seqfold,求教:m-fold cross validation 在matlab下如何实现?