198. House Robber【力扣】

题意理解

给定一组数,每次取一个数,连续两次取的数不能相邻,问可以取的数总和最大是多少

问题分析

用动规

状态量是满足要求的前n个数的总和的最大值

状态转移方程是,前n个数的最大和等于前n-1个最大和,与前n-2个最大和+第n-1个数的和,两者之间的最大值。初值有两个,dp[0]= 0,dp[1]=a[0]。

其他

链接

    int rob(vector& nums) {
        int len = nums.size();
        if (len == 0)   // 输入为空
            return 0;   // 输出为0
        int dp[len + 1] = {};   //dp数组
        dp[0] = 0;  //设置初值0
        dp[1] = nums[0];    //只有一个房子,就打劫一家
        for(int i = 2; i <= len; i ++)  
        {
            dp[i] = max(dp[i - 2] + nums[i - 1], dp[i - 1]); //前i个房子的钱等于前i-2个房子的钱+第i-1个房子的钱,与钱i-1个房子的钱之间的最大值
        }
        return dp[len]; //最后一个是前n个房子的钱
    }

 

你可能感兴趣的:(算法,工作刷题,动态规划)