台中市网站建设_网站建设公司_动画效果_seo优化
2025/12/22 17:54:11 网站建设 项目流程

题目

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:
输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

题解

classSolution{publicintrob(int[]nums){intprev=0;intcurr=0;// 每次循环,计算“偷到当前房子为止的最大金额”for(inti:nums){// 循环开始时,curr 表示 dp[k-1],prev 表示 dp[k-2]// dp[k] = max{ dp[k-1], dp[k-2] + i }inttemp=Math.max(curr,prev+i);prev=curr;curr=temp;// 循环结束时,curr 表示 dp[k],prev 表示 dp[k-1]}returncurr;}}

解析

出自:图解动态规划的解题四步骤(C++/Java/Python)

classSolution{//定义解决方案类publicintrob(int[]nums){//函数rob以非相邻元素整型数组'nums'作为输入参数,并返回在该序列中可以窃取到的最大值。intprev=0;//初始化第一个状态为第零个房子(之前没有房子可偷取的状态)intcurr=0;//初始化第二个状态为第一个房子(当前已经进入了情况,可以开始考虑窃取下一个房子的情况)for(inti:nums){//这是对输入数组的遍历 - 'i'表示每个房子的金额。它涵盖了所有可能的元素(非相邻房屋的值,根据输入大小和长度而定)inttemp=Math.max(curr,prev+i);//计算如果我们当前处于数字'i'处时可以偷取到的最大金额。它等于当前可能窃取到的最大值和前一个状态下已经找过的最大的有效数+到目前为止的房间价格中的较大值prev=curr;//通过更新当前最大值和下一个最大值,将计算切换到输入数组的下一个房子(即将数字'i + 1'视作第k个状态)。它表示如果我们当前处于第(n - 2)个房子处时可以窃取到的最大金额curr=temp;//通过更新当前最大值和下一个最大值,将计算切换到输入数组的下一个房子(即将数字'i + 1'视作第k+1个状态)。它表示如果我们当前处于第(n - 1)个房子处时可以窃取到的最大金额returncurr;}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询