小偷能获取的最大金额 & 环形小区 [分类讨论第一家是否能偷]

题目
有一个环形的小区,每家有一定的金额,使用nums[]数组表示,小偷进了小区进行偷取。
小偷偷了一家后,与这家相邻的家就不能再偷了,请问小偷能偷取的最大金额是多少?

思路
若小区只是一排,那题目就简单了,简单dp即可。
dp[i][0] 表示不偷取第i家,在前i家中可偷取的最大金额
dp[i][1] 表示偷取第i家,在前i家中可偷取的最大金额
那么可得:
dp[i][0] = max(dp[i-1][0], dp[i-1[1])
dp[i][1] = dp[i-1][0] + nums[i]

现在由于是环形的,所以在上面的基础上,添加了一个限制条件:第一家和最后一个不能同时被偷。

其实我们只需分类讨论第一家的情况即可,他们只是设置初始值的区别:
1:可以偷取第一家
dp[0][0] = 0; dp[o][1] = nums[0];
最终最大值结果为:最后一家不能偷 dp[n-1][0]

2:不可以偷第一家
dp[0][0] = 0; dp[0][1] = 0;
最终最大值结果为 max(dp[n-1][0], dp[n-1][1]);

这两个中情况的结果的最大值,即为最后的结果。

package com.STILLxjy;

public class Main {
   

    public static void main(String[] args) {
   
        int[] nums = new int[]{
   5,1,2,3,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值