你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。
主要思路:按最后一个房屋是否被闯,可分为两种情况。
public int GetMaxSum(int[] array) //1,9,5,3,2,8,6
{
if (array == null || array.Length == 0)
{
return 0;
}
else if (array.Length == 1)
{
return array[0];
}
else if (array.Length == 2)
{
return Math.Max(array[0], array[1]);
}
else
{
//新的数组0~n-2
int[] newArray = new int[array.Length - 2];
for (int i = 0; i < newArray.Length; i++)
{
newArray[i] = array[i];
}
//新的数组0~n-1
int[] newArray2 = new int[array.Length - 1];
for (int i = 0; i < newArray2.Length; i++)
{
newArray2[i] = array[i];
}
return Math.Max(GetMaxSum(newArray) + array[array.Length - 1]
, GetMaxSum(newArray2));
}
}
js实现思路
/**
*
* @param {Array} arr
*/
function test(arr) {
if(!arr.length) {
return 0;
}
if(arr.length === 1) {
return arr[1];
}
if(arr.length === 2) {
return Math.max(arr[0], arr[1]);
}
const dp = [arr[0], arr[1]];
for(let i = 2; i < arr.length; i++) {
dp[i] = Math.max(dp[i - 2] + arr[i], dp[i - 1])
}
return dp[arr.length - 1];
}