2026/4/17 23:40:35
网站建设
项目流程
成都网站建设cdajcx,cms开发,湖北省荆门市城乡建设网站,网站建设 昆明 价格题目#xff1a;你是一个专业的小偷#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入#xff0c;系统会自动报警。给定一个代表每个…题目你是一个专业的小偷计划偷窃沿街的房屋。每间房内都藏有一定的现金影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统如果两间相邻的房屋在同一晚上被小偷闯入系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组计算你不触动警报装置的情况下一夜之内能够偷窃到的最高金额。一、题目理解给定一个数组nums其中nums[i]表示第i间房子的金额相邻的房子不能同时抢目标是在不触发警报的前提下抢到最多的钱。二、为什么这是动态规划问题这是一个**典型的「选择 约束」问题每一间房子只有两种选择抢不抢选择当前房子会影响后续选择相邻不能抢这种「当前决策依赖之前结果」的结构非常适合用动态规划DP。三、状态定义关键定义dp[i] 抢到第 i 间房子为止能够获得的最大金额注意dp[i] 不是「是否抢第 i 家」而是在前 i 家房子中能拿到的最大值四、状态转移方程核心考虑第i间房子有两种情况情况 1不抢第 i 间房那么最大金额等于dp[i-1]情况 2抢第 i 间房那第i-1间房一定不能抢上一个合法状态只能来自i-2那么最大金额等于dp[i-2] nums[i]class Solution { public: int rob(vectorint nums) { int n nums.size(); if (n 1) return nums[0]; vectorint dp(n); dp[0] nums[0]; dp[1] max(nums[0], nums[1]); for (int i 2; i n; i) { dp[i] max(dp[i-1], dp[i-2] nums[i]); } return dp[n-1]; } };综合两种情况dp[i] max( dp[i-1], dp[i-2] nums[i] )这一步是整道题的灵魂五、初始条件dp[0] nums[0] dp[1] max(nums[0], nums[1])