`

动态规划总结(三)

阅读更多
House Robber问题属于一维的动规问题,这篇文章给大家介绍一下。

1,House Robber
一个小偷去一条街上偷东西,假设这条街上有n个房子,每个房子里都有特定的现金,但是小偷不能偷连续的房子,那样会触发警报,问怎样才能偷到最多的钱。

我们把这条街抽象成一个数组,数组里的值代表了房子里现金的数目,假设小偷拿了第0个房子的钱,那么第1个房子的钱就不能拿,否则就会触发警报。我们创建一个数组result[],result[i]代表了到第i个房子小偷最多能得到的钱数,result[i] = Math.max(result[i - 1], result[i-2] + nums[i - 1]) (i > 2),这就是递推式,这样我们一直计算到最后一个房子,我们就得到了现金最大的方案。代码如下:
public class Solution {
    public int rob(int[] nums) {
        if(nums == null || nums.length == 0) return 0;
        int[] result = new int[nums.length + 1];
        result[1] = nums[0];
        for(int i = 2; i <= nums.length; i++) {
            result[i] = Math.max(result[i - 1], result[i - 2] + nums[i - 1]);
        }
        return result[nums.length];
    }
}


2,House Robber II
这道题是第一道题的变形,这里假设这条街是个环状,就是第一个房子和最后一个房子也是相连的,也就是说,如果拿了第一个房子里的钱,最后一个房子的钱就不可以拿。

处理这个问题我们可以把它分成两个子问题,第一个拿第一个房子的钱,这样就不能哪最后一个房子里的钱; 第二个是不拿第一个房子的钱,这样就可以拿最后一个房子的钱;我们分别计算出最优值,然后进行比较,取一个最大值就是我们要找的解。代码如下:
public class Solution {
    public int rob(int[] nums) {
        if(nums == null || nums.length == 0) return 0;
        if(nums.length == 1) return nums[0];
        if(nums.length == 2) return Math.max(nums[0], nums[1]);
        
        int[] result = new int[nums.length];
        result[0] = 0;
        result[1]= nums[0];
        for(int i = 2; i < result.length; i++) {
            result[i] = Math.max(result[i - 1], result[i - 2] + nums[i - 1]);
        }
        int tem = result[nums.length - 1];
        Arrays.fill(result, 0);
        result[1] = nums[1];
        for(int i = 2; i < result.length; i++) {
            result[i] = Math.max(result[i - 1], result[i - 2] + nums[i]);
        }
        
        return Math.max(tem, result[result.length -1]);
    }
}
分享到:
评论

相关推荐

    数据结构动态规划算法总结

    数据结构动态规划算法总结 动态规划是一种重要的算法思想,广泛应用于经济管理、生产调度、工程技术和最优控制等方面。动态规划是解决多阶段决策过程的优化问题的数学方法,由美国数学家R.E.Bellman等人在20世纪50...

    算法动态规划总结(拓展篇)

    从给定的文件标题“算法动态规划总结(拓展篇)”和描述“算法动态规划拓展总结,内含详细解说和代码”中,我们可以提炼出一系列关于动态规划算法的知识点,这些知识点涵盖了动态规划的多种应用及其优化技术。...

    算法动态规划总结(基础篇)

    ### 动态规划基础总结 #### 一、概述 动态规划是一种解决最优化问题的方法,其核心思想是将原问题分解成互相重叠的子问题集合,并存储子问题的解来避免重复计算,最终达到求解原问题的目的。本文将对计算机算法中...

    动态规划总结.doc

    动态规划是一种解决问题的有效方法,尤其在处理具有重叠子问题和最优子结构的复杂问题时。在算法分析与设计中,动态规划算法扮演着至关重要的角色。以下是对动态规划算法的详细阐述,以及如何应用于矩阵连乘问题。 ...

    动态规划 资料 动态规划总结

    本资料主要对动态规划进行了全面的总结,旨在帮助读者深入理解和掌握这一概念。 一、动态规划基础 动态规划的核心是将一个复杂的问题分解为多个相互关联的子问题,然后通过解决这些子问题来求解原问题。它与分治法...

    动态规划题目总结。。。。

    这是一个三参数的递归函数,使用动态规划进行优化。由于直接递归会导致超时(TLE),所以采用自底向上的方法,预先计算并存储所有可能的函数值。这里使用了一个三维数组来存储`w(a, b, c)`的值,从`w(0,0,0)`开始...

    动态规划总结

    "dp总结(上).pptx"、"dp总结(中).pptx"和"dp总结(下).pptx"这三份文件很可能是详细的讲义或教程,包含了上述各个领域的实例和解析,建议仔细研读,通过实践加深理解,提升动态规划的实战技巧。

    ACM动态规划总结

    动态规划是一种在计算机科学中广泛使用的算法设计策略,特别是在解决最优化问题时。它通过将一个大问题分解成若干小的子问题,并利用...通过不断练习和总结,参赛者能够更好地掌握动态规划的技巧,提高编程竞赛的成绩。

    acm动态规划总结

    采用动态规划的方法,我们可以开一个三维数组来存储已计算过的函数值,避免重复计算,显著降低计算时间。动态规划算法的核心在于找到合适的子问题划分和状态转移方程,这里的状态转移方程可以看作是利用已知的w(20,...

    《动态规划算法实验》实验报告.docx

    《动态规划算法实验》实验报告主要探讨了两个经典动态规划问题——0-1背包问题和合唱队形安排问题。这两个问题都是在优化决策过程中寻找最优解的经典实例。 **一、0-1背包问题** 0-1背包问题是一个经典的约束优化...

    运用LINGO解决某些动态规划的问题

    本篇文章将深入探讨如何运用LINGO来解决动态规划问题,通过具体的案例分析,我们将了解LINGO在动态规划中的应用方法和步骤。 ### 动态规划与LINGO 动态规划是一种用于解决多阶段决策过程中的最优化问题的方法,其...

    NOIP数学与动态规划-2020.08.18(B).pdf

    本资源摘要信息涵盖了 NOIP 数学与动态规划的所有方面,包括基础知识、动态规划专题、NOIP 动态规划总结、ACM 动态规划总结、Scratch 创意编程班和人工智能中小学系列课程等,旨在帮助读者快速了解 NOIP 数学与动态...

    浅析动态规划算法

    三、动态规划的分类 1. 序列动态规划:如斐波那契数列、最长公共子序列等,问题通常与序列或数组操作相关。 2. 图形动态规划:如最短路径问题、最小生成树等,问题涉及到图的遍历和优化。 3. 空间动态规划:如背包...

    动态规划问题解题思路和总结

    ### 动态规划问题解题思路和总结 #### 动态规划概述 动态规划是一种用于求解具有重叠子问题和最优子结构特征的问题的强大工具。这种方法不仅在计算机科学领域有着广泛的应用,而且在数学、经济学等多个学科也有着...

    常见动态规划问题总结

    1.三角形找一条从顶到底的最小路径 2.最大子数组和 3.回文最小划分次数 4.最佳时间买卖股票 5. 判断字符串s3是否由s1,s2交叉存取组成 6.给定一个矩形表格,求从顶到底的最小和 7.使两个字符串相等,最小的编辑次数 ...

    动态规划经典教程 acm

    首先,理解动态规划的三要素至关重要:阶段、状态和决策。阶段可以视为问题解决过程中的步骤或者子任务,状态则是问题在某一阶段的完整描述,而决策则是从一个状态转移到另一个状态的选择。以生产雪糕为例,阶段可能...

    算法与分析实验三:动态规划法

    总结来说,动态规划在解决矩阵连乘问题时,通过分解问题为子问题并存储子问题的解,有效地减少了计算量,实现了高效求解。这个实验不仅让学生掌握了动态规划的基本思想,还锻炼了他们将算法转化为实际程序的能力。

    acm 动态规划总结,关于背包问题

    通过动态规划,我们可以避免重复计算,将结果存储在一个三维数组中,自底向上逐步计算到目标状态w(20,20,20)。这个例子展示了如何处理具有大量重叠子问题的情况。 Pku ACM 2081 "Recaman's Sequence" 是一个基于...

Global site tag (gtag.js) - Google Analytics