自学内容网 自学内容网

代码随想录:打家劫舍||

打家劫舍||

循环数组用拼接数组处理,并多起点dp,取所有结果的最大值。
class Solution {
public:
    int rob(vector<int>& nums) {
      int dp[500] ;
      int n=nums.size(); if(n==1)return nums[0];
      nums.insert(nums.end(),nums.begin(),nums.end());
      //数组倍增一下
      int result1=DP(nums,dp,0,n-2);
      int result2=DP(nums,dp,1,n-1);
      //两种情况,第一种不包括最后一个元素,第二种不包括第一个元素
      //因为成环首尾最多偷一个
       return max(result1,result2);
       //两种情况取最大值
    }
    int DP(vector<int>&nums,int dp[],int be,int en)
    {//be是起点,en是最开始对应的终点
        int ant=0;//存最终结果
        for(int i=be;i<=en;i++)
        {  
            //循环从不同起点开始,算它的最高金额
             memset(dp,0,sizeof(dp));
             //重置dp数组
             dp[i]=nums[i],dp[i+1]=max(nums[i],nums[i+1]);
             //初始化前两个元素,其实这里跟打家劫舍一代码基本没啥区别了
             for(int j=i+2;j<=i+en-be;j++)
             dp[j]=max(dp[j-2]+nums[j],dp[j-1]);
            //当前房子取或不取
            //取则+dp[j-2]
            //不取则为dp[j-1]
             ant=max(ant,dp[i+en-be]);
             //取最大金额保存
        }
        return ant;
        //返回最大金额
    }
};


原文地址:https://blog.csdn.net/qq_74924951/article/details/142371734

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!