安徽合肥制作网站公司,是不是做推广都得有网站,wordpress随机发布文章,如何更改wordpress登录密码错误你是一个专业的小偷#xff0c;计划偷窃沿街的房屋#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 #xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时#xff0c;相邻的房屋装有相互连通的防盗系统#xff0c;如果两间相邻的房屋在同一…你是一个专业的小偷计划偷窃沿街的房屋每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 这意味着第一个房屋和最后一个房屋是紧挨着的。同时相邻的房屋装有相互连通的防盗系统如果两间相邻的房屋在同一晚上被小偷闯入系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组计算你 在不触动警报装置的情况下 今晚能够偷窃到的最高金额。 示例 1
输入nums [2,3,2]
输出3
解释你不能先偷窃 1 号房屋金额 2然后偷窃 3 号房屋金额 2, 因为他们是相邻的。示例 2
输入nums [1,2,3,1]
输出4
解释你可以先偷窃 1 号房屋金额 1然后偷窃 3 号房屋金额 3。偷窃到的最高金额 1 3 4 。
示例 3
输入nums [1,2,3]
输出3思路一动态规划
c解法
int rob(int* nums, int numsSize){int dp[numsSize];if (numsSize 0) return 0;if(numsSize1)return nums[0];if(numsSize2)return fmax(nums[0],nums[1]);int i, a[numsSize], b[numsSize];a[0] nums[0];a[1] nums[0];b[0] 0;b[1] nums[1];for(i 2; i numsSize; i) {a[i] fmax(a[i-1], a[i-2] nums[i]);b[i] fmax(b[i-1], b[i-2] nums[i]);}return fmax(a[numsSize-2], b[numsSize-1]);}
分析
本题为动态规划经典问题之一打家劫舍找出状态方程a[i] fmax(a[i-1], a[i-2] nums[i]);因为不能偷相邻房屋所以偷的金额最大有两种可能从第一个开始和第二个开始分别计算两种情况的最大金额再比较两个金额即可得到答案
总结
本题考察动态规划的应用分别考虑从第一和第二个开始的情况即可解决