窃贼打劫

题目

假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。

给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。

样例

给定 [3, 8, 4], 返回 8.

要求

O(n) 时间复杂度 且 O(1) 存储。

思路

假设你来到一个房子面前,你有两种选择:打劫或者放弃。
如果打劫,那么此时的打劫金额等于从第一个房子至上上一个房子打劫所获得的金额加上打劫该房子获得的金额。
如果放弃,此时的金额依旧等从第一个房子到上一个房子打劫所获的金额。

动态规划

  • 方程:f[n]=max(f[n-1],f[n-2]+money[n]);
  • n表示第n个房子,n-1表示上一个房子,n-2表示上上一个房子。
  • f[n]表示打劫前n个房子所获得的最大金额。

代码

  • @param A: An array of non-negative integers.
  • return: The maximum amount of money you can rob tonight
public class Solution {
    public static long houseRobber(int[] A) {
        int len = A.length;
        // dp[i] 表达打劫i房间为止所活动的收获 ,与dp[i-2] dp[i-3]有关
        if(len ==0)
            return 0;
        if(1==len)
            return A[0];
        
        long dp[] = new long[len];
        dp[0]=A[0];
        dp[1]= Math.max(A[0],A[1]);
        for(int i=2;i<len;++i){
            dp[i]=Math.max(dp[i-2]+A[i],dp[i-1]);
        }
        return dp[len-1];
    }
    
    public static void main(String[] args) {
        int a[] = new int[]{3,8,4};
        System.out.println(houseRobber(a));
    }
}

输出:8

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

推荐阅读更多精彩内容

  • 有就是她在外面玩的不开心,心情不好的时候,她就会毒打我,这已经成为她排解压力的方式。有时候我一度觉得她有精神问题。...
    无忌西东7阅读 320评论 0 10
  • 上午本来想复习数值分析,看了几页看不下去了,等复习周再说吧。然后又开始配置wampserver,端口改了,http...
    拧螺丝的小姑娘阅读 125评论 0 0
  • 没事翻翻朋友圈,突然看到一个标题《有一样东西,比男人的尺寸还终于》,一看就是标题党,下面居然还有几个相熟的朋友的点...
    何以简阅读 9,337评论 0 0
  • 昨天写了《穷人与富人的差距之一:对钱的认识不同》,今天继续来探讨。其实穷人之所以穷,刨除家庭条件、受教育程度、地域...
    漫步者说事阅读 1,277评论 6 4