HouseRober(简单的偷盗问题)

本文探讨了一个经典的动态规划问题——打家劫舍。假设一条街上的房子排成一行,每个房子里有一定数量的钱财,但相邻的房子有警报系统相连,若两间相邻的房子在同一天被打劫,则警报会响。给出一整数数组来表示各个房子内存放的金额,计算在不触动警报的情况下,能够窃取的最高金额。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设有一个强盗,在一条街上进行盗窃,一条街上有一排房子,每个房子中有一定数额的金钱,你不能同时打劫相邻的房子,求一晚上能打劫的最大“收益”。
分析:

  1. 有i个房子,每个房间金钱为W[i],从第1个房子开始盗窃,对每一个房子只有两种选择,偷或者是不偷。这里用dp[i]表示到第i个房子时,最大收益。
  2. 第i个房子,如果偷,则dp[i] = dp[i-2] + W[i],(i-2 是因为相邻房子不能偷,既然偷了i,则上一个最接近的房子应该是i-2)。如果不偷,则dp[i] = dp[i-1]。然后,我们需要对从这两种选择获取的收益进行比较,选取最大的一种,这样,状态转移方程就出来了,dp[i]=Math.max(dp[i-1],dp[i-2]+W[i])
  3. 接下来讨论方程的出口,也就是该方程什么时候可以结束。当i==0时,只有一个房子,那么我们必须偷,否则就什么都没有了,则dp[0]=W[0],当只剩2个房子时,只能从两个房子中选择一个房子,则dp[1] = Math.max(dp[0],dp[1])

代码实现:

public static void main(String args[]) {
		int[] nums = {1,2,4,1,7,8,3};
		int num = rob(nums);
		System.out.println(num);
	}
	
public static int rob(int[] nums) {
		int[] dp = new int[nums.length];
		dp[0] = nums[0];
		dp[1] = Math.max(nums[0], nums[1]);
		for(int i=2;i<nums.length;i++) {
			int A = dp[i-1];
			int B = dp[i-2]+nums[i];
			dp[i] = Math.max(A, B);
		}
		return dp[nums.length-1];
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值