lintcode 476. 石子归并

经典区间dp问题

链接

这道题里dp[i][j] 代表归并i 到j 所需要的最小成本,

对于k, 有j> k >= i

dp[i][j] = min(dp[i][k] + dp[k+1][j] + weights(i,j)), (因为每次合并两堆,倒数第二次肯定是剩下两堆)

这个即为状态方程,本题的dp写法可以作为模板式的区间dp做法

public class Solution {
    /**
     * @param A: An integer array
     * @return: An integer
     */
    public int stoneGame(int[] A) {
        // write your code here
        if(A == null || A.length == 0){
            return 0;
        }
        int n = A.length;
        int[][] dp = new int[n][n];
        //初始化,合并同一堆不需要重量成本
        for(int i = 0; i < n; i++){
            dp[i][i] = 0;
        }
        for(int l = 2; l <= n; l++){
            for(int i = 0; i + l - 1 < n; i++){
                int j = i + l - 1;
                dp[i][j] = Integer.MAX_VALUE;
                int wei = wei(A, i, j);
                for(int k = i; k < j; k++){
                    dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k+1][j] + wei);
                }
            }
        }
        return dp[0][n-1];
        
    }
    //别忘了每次合并还需要两堆重量
    int wei(int[]A, int s, int e){
        int wei = 0;
        for(int i = s; i <= e; i++){
            wei += A[i];
        }
        return wei;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,350评论 0 33
  • 简介 区间dp,顾名思义就是在一段区间上进行动态规划。对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是...
    Steven1997阅读 11,612评论 0 2
  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 13,718评论 0 5
  • 《程序员代码面试指南-左程云》笔记 第一章 栈和队列 设计一个有getMin功能的栈 实现一个特殊的栈,在实现栈的...
    xiaogmail阅读 18,595评论 2 19
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,020评论 0 2