题目:劫匪去抢劫一条街,要求不能抢连续的2个房子。求最多能抢多少钱。
分析:动态规划。对当前房子,有2个状态,抢或不抢。如果抢,要求前一个房子不抢。如果不抢,则总资源不增多。
代码:
class Solution {
public:
int dontRob[5000], doRob[5000];
int rob(vector<int>& nums) {
int totNum = nums.size();
if (totNum < 1)
return 0;
doRob[0] = nums[0];
dontRob[0] = 0;
for (int i = 1; i < totNum; i++)
{
doRob[i] = dontRob[i - 1] + nums[i];
dontRob[i] = doRob[i - 1];
if (doRob[i] < doRob[i-1])
doRob[i] = doRob[i-1];
}
return doRob[totNum - 1]>dontRob[totNum-1]? doRob[totNum - 1]:dontRob[totNum-1];
}
};
其实不需要搞2个数组,感觉思维真的混乱,update:
# coding: utf-8
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = [0 for _ in nums]
# 空数组
if len(nums) <=0:
return 0
res[0] = nums[0]
# 长1
if len(nums) == 1:
return res[0]
# 长2
res[1] = max(nums[0], nums[1])
if len(nums) == 2:
return res[len(nums) - 1]
for i in range(2, len(nums)):
res[i] = max(res[i-1], res[i-2] + nums[i])
return res[len(nums) - 1]