小明要在街上一排互相相邻的糖果屋拿糖,但不能在两个相邻的糖果屋同时拿糖。给定一个数组列表,每个元素代表每间房子中的糖的数目,小明一次最多能拿多少糖。
基本样例输入输出:
输入: [1,5,3,1,7]
输出: 12
来看一下,这个题目其实就是在考察不相邻元素的最大和
思路:
前i个元素的最大子数组包含第i个元素和不包含第i个元素。
- 包含第i个元素,则一定不能包含第i-1个元素,包含第i个元素的最大子数组为不包含第i-1个元素的最大子数组和加上第i个元素
- 不包含第i个元素,则前i个元素的最大子数组和就是前i-1个元素的最大子数组和,因为
对于前i个元素,设包含第i个元素的最大子数组和为dp[i],不包含第i个元素的最大子数组和为np[i],前i个元素的最大子数组和为max(dp[i], np[i]),根据上面的分析,则有如下推导公式:
- dp[i] = np[i-1]+arr[i]
- np[i] = max(np[i-1], dp[i-1])
const maxSum = arr => {
const size = arr.length;
if (size <= 0) return 0;
else if (size == 1) return arr[0];
let excludeLast = 0,
includeLast = arr[0];
let excludeTemp;
for (let i = 1; i < size; i++) {
excludeTemp = excludeLast > includeLast ? excludeLast : includeLast;
includeLast = excludeLast + arr[i];
excludeLast = excludeTemp;
}
return includeLast > excludeLast ? includeLast : excludeLast;
};