基于动态规划的异种打家劫舍问题(力扣:删除并获得点数

打家劫舍问题:

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

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

思路

        首先我们考虑当街道只有一个房间时,显然最高金额为这个房间的价值;当街道有两个房间时,因为我们只能选取相邻房间中的一个房间,所以最高金额应为两个房间中价值较高一个;

        那么当街道有k(k > 2)个房间时又该怎样才能利益最大化呢?作为一名经过专业训练的小偷当然要探索出怎样才能拿到最多的钢镚啦~情况无非分为两中:

        如果窃取第k个房间,那么为了防止报警器报警,我们就要放弃相邻的房间,即:第k - 1个房间。此时我们得到的最大金额就应该为前k-2个房间的最高金额与第k个房间的总和;

        如果不窃取第k个房间,为了利益最大化我们会选择顺走第k-1个房间的钢镚,那么我们得到的最大金额就应该为前k-1个房间的最大金额。

        所以我们只需要选取两种情况中金额最大的即可。

        所以当我们设dp[i]为前i个房间所能得到的最大金额,就能得到房间数大于2时的状态转移方程:

                dp[i] = max(dp[i - 2] + dp[i] , dp[i - 1])

C代码

#inc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值