题目链接:213. 打家劫舍 II - 力扣(LeetCode)
算法思想:代码随想录 (programmercarl.com)
算法实现:
int robI(int *nums,int start,int end){
//1.dp[i]表示偷窃到i号房屋时,能偷窃到的最高金额数
//2.递推式:dp[i]=fmax(dp[i-1],dp[i-2]+nums[i]);
//3.初始化:dp[start]=nums[start];
//4.初始化:i从0~n-1
if(start==end) return nums[start];
int *dp=(int *)malloc(sizeof(int)*(end-start+1));
dp[start]=nums[start];
dp[start+1]=fmax(nums[start],nums[start+1]);
for(int i=start+2;i<=end;i++){
dp[i]=fmax(dp[i-1],dp[i-2]+nums[i]);
}
return dp[end];
}
int robII(int *nums,int numsSize){
//1.dp[i]表示偷窃到i号房屋时,能偷窃到的最高金额数
//2.递推式:dp[i]=fmax(dp[i-1],dp[i-2]+nums[i]);
//3.初始化:dp[0]=nums[0];
//4.遍历顺序:与I不同之处在于,i从0~n-2和从1~n-1两次遍历,结果取最大值
if(numsSize==1) return nums[0];
int ans1=robI(nums,0,numsSize-2);
int ans2=robI(nums,1,numsSize-1);
return fmax(ans1,ans2);
}