zoukankan      html  css  js  c++  java
  • leetcode 198.打家劫舍

    题目:

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

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

    分析:

    这个题目是一个非常明显的动态规划问题,首先题目规定你不可以连续偷窃,其次每一家现金的数额不可能是负数,所以不必担心当前已偷金额会减少的问题。

    过程:

    所以可以推导出当前应偷金额的最大数目为dp[n]=(dp[n-2]|dp[n-3])+nums[n],但是在最后一家和倒数第二家会存在绝对有一家不能偷窃的问题,所以最大金额不能只看最后一家的最大金额,返回的数字应该取这两家之间的较大值。

    代码:

    我把比较简单容易理解的深搜代码也贴上了一份

     1 class Solution {
     2     int tol;
     3     int max=0;
     4     public int rob(int[] nums) {
     5         if(nums.length<1)
     6             return 0;
     7         if(nums.length==1)
     8             return nums[0];
     9         int rec[]=new int[nums.length];
    10         rec[0]=nums[0];
    11         rec[1]=nums[1];
    12         for(int n=2;n<nums.length;++n) {
    13             if(n-3>=0)
    14                 rec[n]=(rec[n-2]>rec[n-3]?rec[n-2]:rec[n-3])+nums[n];
    15             else
    16                 rec[n]=rec[n-2]+nums[n];
    17         }
    18         return rec[nums.length-1]>rec[nums.length-2]?rec[nums.length-1]:rec[nums.length-2];
    19     }
    20     /*
    21      * 深搜时间太长,不推荐
    22     public void dfs(int[] nums,int step) {
    23         if(step+2>=nums.length&&tol>max) {
    24             max=tol;
    25             return;
    26         }
    27         for(int n=step+2;n<nums.length&&n<step+4;++n) {
    28             tol=tol+nums[n];
    29             dfs(nums,n);
    30             tol=tol-nums[n];
    31         }
    32     }
    33     */
    34 }
  • 相关阅读:
    求列表中指定元素的位置
    Hash_P1026毒药?解药?
    Hash_集合
    bzoj1483: [HNOI2009]梦幻布丁
    bzoj1724: [Usaco2006 Nov]Fence Repair 切割木板
    容斥原理
    bzoj1042: [HAOI2008]硬币购物
    [Noi2016十连测第五场]二进制的世界
    NOI2016模拟赛Zbox loves stack
    bzoj2038: [2009国家集训队]小Z的袜子(hose)
  • 原文地址:https://www.cnblogs.com/CHAHA123/p/10569323.html
Copyright © 2011-2022 走看看