打家劫舍问题

简介: 打家劫舍问题

题目

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。


实例1:

输入:[1,2,3,1]

输出:4

解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。

偷窃到的最高金额 = 1 + 3 = 4 。


实例2:

输入:[2,7,9,3,1]

输出:12

解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

偷窃到的最高金额 = 2 + 9 + 1 = 12 。


提示:

1 <= nums.length <= 100

0 <= nums[i] <= 400

解题思路

如果你是初次接触动态规划的问题,你只需要牢记一句话:“当前的结果都是由之前的过程推导出来的。”而不可以是先考虑后面的情况,因为后面的情况是未知的,我们只知道前面的结果,用已知求未知是关键。


①要把推导的过程列出来,从而知道当前结果是怎么推导出来的(画表格),

②根据表格规律,进而写出递推方程式

③找出base情况(即dp [i] 的基础情况,这道题的base情况就是数组中每个元素本身)

④根据方程式计算出 dp 中其他内容

当前金额是由(前一个的金额)或(当前金额加上除前一个金额外最大的金额)中大的那个构成

过leetcode代码如下(Java):

class Solution {
    public int rob(int[] num){
        int []dp = new int[num.length];
//      递推方程:dp[i] = max(dp[i-1] , dp[i]+max(dp[i-2]~dp[0]))
        for (int i = 0; i < num.length; i++) {
            dp[i] = num[i];
        }
        for (int i = 1; i < dp.length; i++) {
            int max = 0;
            for (int j = i - 2; j >= 0; j--) {
                if (dp[j] > max)
                    max = dp[j];
            }
            dp[i] = Math.max(dp[i - 1], dp[i] + max);
        }
        int max = 0;
        for (int j : dp) {
            if (j > max)
                max = j;
        }
        return max;
    }
}

过lanqiao代码如下(Java):

import java.util.Scanner;
public class Main {
    static int[] dp;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        line = line.substring(1, line.length() - 1);
        String[] array = line.split(",");
        dp = new int[array.length];
//      递推方程:dp[i] = max(dp[i-1] , dp[i]+max(dp[i-2]~dp[0]))
        for (int i = 0; i < array.length; i++) {
            dp[i] = Integer.parseInt(array[i]);
        }
        for (int i = 1; i < dp.length; i++) {
            int max = 0;
            for (int j = i - 2; j >= 0; j--) {
                if (dp[j] > max)
                    max = dp[j];
            }
            dp[i] = Math.max(dp[i - 1], dp[i] + max);
        }
        int max = 0;
        for (int j : dp) {
            if (j > max)
                max = j;
        }
        System.out.println(max);
    }
}

总结

当我们初次接触到dp问题时,总是以最直观的方法进行求解,即先思考后面的情况如何规划,却没有想到后面的情况是不可预知的;应该仔细分析已知条件,从前面已知的条件入手,推导出当前这项的最优解,这也是动态规划的核心!

文章粗浅,希望对大家有帮助!

相关文章
|
关系型数据库 MySQL Linux
|
机器学习/深度学习 双11
基于机器学习的内存故障预测了解一下 | 双11备战
本文通过对服务器日志的分析,综合服务器的一些静态信息和状态信息,利用机器学习模型,进行服务器内存故障进行预测。
4423 0
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
400 1
|
机器学习/深度学习 编解码 算法
【计算机视觉 | Transformer】arxiv 计算机视觉关于Transformer的学术速递(8 月 10 日论文合集)
【计算机视觉 | Transformer】arxiv 计算机视觉关于Transformer的学术速递(8 月 10 日论文合集)
|
安全 搜索推荐 数据库
网站被黑检测与网站被黑处理方法
看到此文后,我认为你应该试着通过此文的方法检测一下你的网站是否被黑,因为有可能你的网站被黑了,连你自己都不知道,从下面的图片可以明显的看得出,我的网站也曾被黑过,但这位大神并没有打算处理我的网站,所以只是在网站上传一个文件来提醒我的,或许大家的网站中也有类似的情况。
11401 0
|
Java 应用服务中间件
tomcat启动startup.bat一闪而过解决方案
tomcat启动startup.bat一闪而过解决方案
437 0
|
监控 前端开发 关系型数据库
zabbix部署【各模块详细介绍】(一)
zabbix部署【各模块详细介绍】
493 0
|
程序员 数据库
Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 操作数类型冲突: varbinary 与 text 不兼容
Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 操作数类型冲突: varbinary 与 text 不兼容
1425 0
|
数据采集 并行计算 PyTorch
【目标检测之数据集加载】利用DataLoader加载已预处理后的数据集【附代码】
在前一篇文章中,已经通过继承Dataset预处理自己的数据集 ,接下来就是使用pytorch提供的DataLoader函数加载数据集。
865 0
【目标检测之数据集加载】利用DataLoader加载已预处理后的数据集【附代码】
Ubuntu中如何查看mp4视频
ubuntu中都是命令行显示,我们要看mp4的话需要安装一些相应的插件,下面我做一个简要的介绍
Ubuntu中如何查看mp4视频