打家劫舍(java语言描述(动态规划))

题目描述:

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

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

 

解题思路:

 不直接考虑所有房子,假设只有1个房子,最大值一定是第一个房子,如果有两个房子,则取两个的最大值

当有n个房子(3个以上)时,最大值为 max(n-1个房子的最大值  , n-2个房子的最大值+第n个房子)

代码:

import java.util.Scanner;

public class djjs {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int max = sc.nextInt();
        int[] arr = new int[max]; //房屋金额
        int[] dp = new int[max];  //第下标个房屋之前的最大值
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextInt();
        }

        dp[0] = arr[0];
        dp[1] = Math.max(arr[0], arr[1]);

        for (int i = 2; i < max; i++) {
            dp[i] = dp[i - 1] > dp[i - 2] + arr[i] ? dp[i - 1] : dp[i - 2] + arr[i];
        }
        //输出每个房屋的金额
        for (int i = 0; i < max; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        //输出到每个房屋时的最大值
        for (int i = 0; i < max; i++) {
            System.out.print(dp[i]+" ");
        }

    }

}

 

posted @ 2021-11-22 13:08  unIlIl  阅读(76)  评论(0)    收藏  举报