打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。
题目解析
动态规划问题的特点:
- 问题可以被划分为若干
重叠
子问题- 子问题可以通过已知的子问题求解,且子问题可以重复利用
- 需要一个数据结构来存储子问题的解,以便在使用时取出
为什么这题能够使用动态规划?
- 重叠子问题:
设总共有 n n n家房屋,原问题则为有 n n n家房屋时所能偷窃到的最大金额。
该问题能够划分为成若干重叠子问题:有 k ( k = 1 … … n − 1 ) k(k=1……n-1) k(k=1……n−1)家房屋时能够偷窃到的最大金额 - 子问题可以通过求解的子问题求解:
有 k k k家房屋时,能够偷窃的最大金额:- 第 k k k家不偷窃时,最大金额 = 当房屋为 k − 1 k-1 k−1时,最大偷窃的金额
- 第 k k k家偷窃时,最大金额 = 第 k − 1 k-1 k−1不偷窃时,最大金额 + 第 k k k家房屋能偷的钱= 当房屋为 k − 2 k-2 k−2时,最大偷窃的金额 + 第 k k k家房屋能偷的钱
解题步骤:
- 将原问题转化为一个或多个子问题
- 定义问题的状态转移方程
- 设置边界条件
- 计算子问题的解并记录
- 由子问题的解得到原问题的解
- 问题【当有 k k k家房屋时,被偷窃最大的金额】可划分为(从左向右看):
- 第 k k k家不偷窃时,最大金额
- 第 k k k家偷窃时,最大金额
- 状态转移方程:
- 子问题为【第 k k k家不偷窃时,最大金额】:
第 k k k家不偷窃,那么第 k k k家肯定不会构成相邻的非法条件。此时可以当第 k k k家不存在,所以问题变成:【房屋数量为 k − 1 k-1 k−1时的最大偷窃金额】 - 子问题为【第 k k k家偷窃时,最大金额】:
此时第 k − 1 k-1 k−1家肯定不能进行偷窃,否则会触发报警器。因此第
- 子问题为【第 k k k家不偷窃时,最大金额】: