美文网首页
LintCode-区间型动态规划石子归并

LintCode-区间型动态规划石子归并

作者: 想当厨子的程序员 | 来源:发表于2018-09-17 18:35 被阅读0次

石子归并

有一个石子归并的游戏。最开始的时候,有n堆石子排成一列,目标是要将所有的石子合并成一堆。合并规则如下:

每一次可以合并相邻位置的两堆石子
每次合并的代价为所合并的两堆石子的重量之和
求出最小的合并代价。

样例

对于石子序列:[4, 1, 1, 4](每个数代表这堆石子的重量),最优合并方案下,合并代价为 18:

  1. 合并第2堆和第3堆 => [4, 2, 4], 代价 +2
  2. 合并前两堆 => [6, 4],代价 +6
  3. 合并剩下的两堆 => [10],代价 +10

其他例子:

[1, 1, 1, 1] 代价为 8
[4, 4, 5, 9] 代价为 43

代码

class Solution:
    """
    @param A: An integer array
    @return: An integer
    """

    def stoneGame(self, A):
        # write your code here
        if len(A) <= 0:
            return 0
        dp_now = [[0 for j in range(len(A))] for i in range(len(A))]
        dp_sum = [[0 for j in range(len(A))] for i in range(len(A))]
        for i in range(0, len(A)):
            dp_now[i][i] = A[i]
            dp_sum[i][i] = 0
        for i in range(0, len(A)-1):
            dp_now[i][i+1] = A[i] + A[i+1]
            dp_sum[i][i+1] = A[i] + A[i+1]
        if len(A) <= 2:
            return dp_sum[0][-1]
        for k in range(2, len(A)):
            for i in range(0, len(A)-k):
                j = i+k
                for m in range(i, j):
                    if m == i:
                        dp_now[i][j] = dp_now[i][m] + dp_now[m+1][j]
                        dp_sum[i][j] = dp_now[i][m] + dp_now[m+1][j] + dp_sum[i][m] + dp_sum[m+1][j]
                    else:
                        dp_now[i][j] = min(dp_now[i][j], dp_now[i][m] + dp_now[m+1][j])
                        dp_sum[i][j] = min(dp_sum[i][j], dp_now[i][m] + dp_now[m+1][j] + dp_sum[i][m] + dp_sum[m+1][j])
        return dp_sum[0][-1]

题目来源

https://www.lintcode.com/problem/stone-game/note

相关文章

  • LintCode-区间型动态规划石子归并

    石子归并 有一个石子归并的游戏。最开始的时候,有n堆石子排成一列,目标是要将所有的石子合并成一堆。合并规则如下: ...

  • 浅谈区间动态规划

    围绕几道题说起。。石子归并、涂色、括号序列 啥是区间动态规划呢,我觉得似乎是指在一段区间上的dp,通过枚举左右子区...

  • 9.3 - 高算6

    继续讲动态规划,这节课讲了三种类型的动态规划: 区间类:求一段区间的解max/min/count转移方程通过区间更...

  • 石子合并 --- 动态规划

    1.分析题目现要将石子有次序地合并成一堆,要求&条件:规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数...

  • ORID46

    今天学习了区间型动态规划 给定一个序列/字符串,进行一些操作 最后一步会将序列/字符串去头/尾 剩下的会是一个区间...

  • 基础算法

    二分查找 冒泡排序(优化) 归并排序 动态规划算法

  • LintCode-数字翻转-动态规划

    描述 给你一个01构成的数组。请你找出最小翻转步数,使得数组满足以下规则:1的后面可以是1或者0,但是0的后面必须...

  • 归并排序(Java版)

    归并排序:当数组只有四个元素的时候可以这样定义归并排序,将数组平均分成两半,分别是左区间和右区间,将左区间、右区间...

  • 【算法分析】——区间dp

    所谓区间dp,指在一段区间上进行动态规划,一般做法是由长度较小的区间往长度较大的区间进行递推,最终得到整个区间的答...

  • LintCode-最大整除子集-动态规划

    描述 给一个由 无重复的正整数 组成的集合,找出满足任意两个元素 (Si, Sj) 都有 Si % Sj = 0 ...

网友评论

      本文标题:LintCode-区间型动态规划石子归并

      本文链接:https://www.haomeiwen.com/subject/atarnftx.html