根据寒神题解 https://leetcode.com/problems/minimum-cost-to-merge-stones/discuss/247567/JavaC%2B%2BPython-DP

题意:

每次可以把连续 K 堆石头合成一堆,花费是 K 堆之和,问最小花费多少可以把全部石头合成 1 堆。不能做到的话,返回 -1。

题解:

因为,每次把 K 堆变成 1 堆,也就是说每次都减去 K-1 堆,最后剩下 1 堆,所以只有在  (n - 1) % (K - 1) == 0  才可以合成 1 堆。

dp[i][j] 表示  stones[i..j]  尽可能合并之后,花费的最小值。

然后枚举第i个石头和前几个石头合成了一堆。 只有长度为  1 + (K-1)*x  时才能合成一堆,所以枚举长度每次加  K - 1 。

class Solution {
public:
int mergeStones(vector<int>& stones, int K) {
int n = stones.size();
if ((n-1) % (K-1)) return -1;
vector<int> prefix(n + 1);
for (int i = 1; i <= n; i++) prefix[i] = prefix[i-1] + stones[i - 1];
vector<vector<int>> dp(n, vector<int>(n, 0));
// 当j-i < K 时不需要合并 所以值为 0
for (int l = K - 1; l < n; l++) {
for (int s = 0; s + l < n; s++) {
int e = s + l;
dp[s][e] = INT_MAX;
for (int m = s; m < e; m += K - 1) {
dp[s][e] = min(dp[s][e], dp[s][m] + dp[m + 1][e]);
}
// l % (K - 1) == 0 刚好可以合成一堆
// 因为枚举的是左边合成一堆,所以左右相加之后一定大于一堆,不是最简状态
// 所以需要再次合并 合并需要的值就是区间和
if (l % (K - 1) == 0) {
dp[s][e] += prefix[e + 1] - prefix[s];
}
}
}
return dp[0][n - 1];
}
};

LeetCode 1000. Minimum Cost to Merge Stones (区间 DP)的更多相关文章

  1. LeetCode 1000. Minimum Cost to Merge Stones

    原题链接在这里:https://leetcode.com/problems/minimum-cost-to-merge-stones/ 题目: There are N piles of stones ...

  2. 1000. Minimum Cost to Merge Stones

    There are N piles of stones arranged in a row.  The i-th pile has stones[i] stones. A move consists ...

  3. [LeetCode] Minimum Cost to Merge Stones 混合石子的最小花费

    There are N piles of stones arranged in a row.  The i-th pile has stones[i] stones. A move consists ...

  4. [Swift]LeetCode1000. 合并石头的最低成本 | Minimum Cost to Merge Stones

    There are N piles of stones arranged in a row.  The i-th pile has stones[i] stones. A move consists ...

  5. 动态规划-Minimum Cost to Merge Stones

    2019-07-07 15:48:46 问题描述: 问题求解: 最初看到这个问题的时候第一反应就是这个题目和打破气球的题目很类似. 但是我尝试了使用dp将问题直接转为直接合并到一个堆问题复杂度迅速提高 ...

  6. leetcode 746. Min Cost Climbing Stairs(easy understanding dp solution)

    leetcode 746. Min Cost Climbing Stairs(easy understanding dp solution) On a staircase, the i-th step ...

  7. LeetCode 983. Minimum Cost For Tickets

    原题链接在这里:https://leetcode.com/problems/minimum-cost-for-tickets/ 题目: In a country popular for train t ...

  8. LeetCode 1130. Minimum Cost Tree From Leaf Values

    原题链接在这里:https://leetcode.com/problems/minimum-cost-tree-from-leaf-values/ 题目: Given an array arr of ...

  9. 2017北京网络赛 J Pangu and Stones 区间DP(石子归并)

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  10. leetcode 730. 统计不同回文子序列(区间dp,字符串)

    题目链接 https://leetcode-cn.com/problems/count-different-palindromic-subsequences/ 题意 给定一个字符串,判断这个字符串中所 ...

随机推荐

  1. python selenium 判断元素是否存在,实现:找到元素,执行对应的代码;找不到元素,继续执行其他代码

    selenium因为找不到元素会抛出异常,导致执行结束 可以考虑使用driver.find_elements(),找不到元素时就会返回空列表,使用if-else语句,判断列表是否为空,非空,则正常找到 ...

  2. Aic 应用开发基础一(概念与场景)

    Agi通用人工智能应用概念与场景 大家看到,自美国OpenAI主导的GPT发布以来,全球科技领域掀起了革命性的浪潮.比如最近看到的aigc 人工绘图,智能机器人等行业,很多新概念掘起, 随着人工智能技 ...

  3. 【MySQL】二级MySQL考试 救场帮助表

    周六去考二级,应用第一题就是添加外键约束 草,写了半天老说语法不对,然后急中生智,觉得默认的库里应该有文档说明表 以下是SQL查询过程: -- 猜测是在mysql库里面 mysql> USE m ...

  4. 【Java-GUI】07 Swing01 入门案例

    Swing是Java自己开发出的一套GUI组件,不同于AWT去调用操作系统的GUI 正是因为非系统平台的GUI,所以程序运行的要慢一些 涉及的设计模式:MVC模式 Model(组件对象状态) View ...

  5. 计算机论文中的SD SE是什么 ?

    Standard Deviation (SD) and Standard Error (SE): 标准差和标准误差:在统计学和数据分析中常用来描述数据的分布和估计值的精确性.SD 表示标准差,SE 表 ...

  6. 甄嬛霸气照 —— Chinese Queen

  7. Webots —— 好用的人形机器人仿真平台

    相关: https://cyberbotics.com/doc/guide/tutorials 下载地址: https://github.com/cyberbotics/webots/releases ...

  8. 始智AI —— https://wisemodel.cn/ —— 试用

    清华大学的合资企业推出的服务: 始智AI -- https://wisemodel.cn/ 链接: 始智AI -- https://wisemodel.cn/ 和modelscope比相对简约,毕竟功 ...

  9. python的logging 模块的propagate设置

    代码: import logging import sys LOG_FORMAT = '[%(asctime)s PID:%(process)d %(levelname)s %(filename)s ...

  10. 手写一个AQS实现

    1.背景 1.AQS简介AQS全称为AbstractQueuedSynchronizer(抽象队列同步器).AQS是一个用来构建锁和其他同步组件的基础框架,使用AQS可以简单且高效地构造出应用广泛的同 ...