打家劫舍问题:
你是一个小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
思路
首先我们考虑当街道只有一个房间时,显然最高金额为这个房间的价值;当街道有两个房间时,因为我们只能选取相邻房间中的一个房间,所以最高金额应为两个房间中价值较高一个;
那么当街道有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