题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
动态规划
int rob(int* nums, int numsSize){
if(numsSize == 0)
return 0;
int* res = (int*)malloc(sizeof(int)*numsSize);
if(numsSize == 1)
return nums[0];
if(numsSize == 2)
return fmax(nums[0],nums[1]);
res[0] = nums[0],res[1] = fmax(res[0],nums[1]);
for(int i = 2;i<numsSize;i++)
res[i] = fmax(res[i-1],nums[i]+res[i-2]);
return res[numsSize-1];
}
int rob(int* nums, int numsSize){
if(nums == NULL || numsSize == 0) {
return 0;
}
if(numsSize == 1) {
return nums[0];
}
int pre = nums[0];
int cur = fmax(nums[0], nums[1]);
for(int i = 2; i < numsSize; i++) {
int temp = fmax(pre + nums[i], cur);
pre = cur;
cur = temp;
}
return cur;
}
int max(int a,int b){
return a>b?a:b;
}
int rob(int* nums, int numsSize){
int num[2]={nums[0],nums[1]};
int pre=num[0],curr=num[1];
if(numsSize==1)
return pre;
curr=max(num[0],num[1]);
for(int i=2;i<numsSize;i++){
int temp=curr;
curr=max(curr,pre+nums[i]);
pre=temp;
}
return curr;
}