动态规划之打家劫舍
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果 。
这是百度百科对于动态规划的解释....一脸懵逼啊,结合我现在的理解来看,其实就是大事化小,小事化了。
结合题来看:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
好好地做个人不好嘛!非要做小偷!!!
-
如果房间只有一个,肯定不用考虑,这个房间的金额就是最高金额
-
如果有两个房间,那就需要考虑下,选择其中最多的那个房间就是最高金额
-
如果大于两个房间呢,比如是三个房间,此时考虑两种情况:
-
(1)假如取第三个房间的钱,那此时最高金额就是第三个房间的钱加上第一个房间
-
(2)假如不取第三个房间的钱,那此时最高金额就是第二个房间的钱
-
此次操作之后,判断这两种情况的最高金额大小,就能得出三个房间的真正的最高金额了
-
如果是四个房间,就是两种情况:
-
(1)假如取第四个房间的钱,那此时最高金额就是第四个房间的钱加上前两个房间的最大值
-
(2)假如不取第四个房间的钱,那此时最高金额就是前三个房间的最大值
-
所以到目前为止,规律就已经出来了,当房间数n大于2时,只需考虑两种情况:
-
(1)假如取第n个房间的钱,那此时最高金额就是第n个房间的钱加上前(n-2)房间的最大值
-
(2)假如不取第n个房间的钱,那此时最高金额就是前(n-1)个房间的最大值
只需要判断这两种情况下,哪一种金额最高,即为真正的最高金额
代码如下:
class Solution {
public int rob(int[] nums) {
int len = nums.length;
if (len == 0) return 0;
if (len == 1) return nums[0];
int[] dp = new int[len];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i < len; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[len - 1];
}
}