题目链接:
题目描述:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
题目分析:
最大金额为前三个房屋除去紧挨着的房屋中的最大金额加上该房屋的金额
题解:
int get_max(int a, int b){ // 返回两个数中的最大值
return a>b?a:b;
}
int rob(int* nums, int numsSize) {
int dp[101] = {0}; // 存放从0开始偷到i位置房屋的最大金额
if(numsSize == 1){ // 当只有一个房屋时,只能偷到该房屋的所有金额
return nums[0];
}
for(int i = 0; i < numsSize; i++){
if(i < 2){ // i小于2时,也只能偷到当前房屋的所有金额
dp[i] = nums[i];
}else if(i == 2){ // i等于2时,最大金额为偷了位置0房屋的金额加上该房屋的金额
dp[i] = nums[i] + nums[i-2];
}else{ // 否则最大金额为前三个房屋除去紧挨着的房屋中的最大金额加上该房屋的金额
dp[i] = nums[i] + get_max(dp[i-2], dp[i-3]);
}
}
return get_max(dp[numsSize-1], dp[numsSize-2]);
}