Day6.2 打家劫舍问题

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

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
solution:
读完题目,这又是一道动态规划问题,如果能够将其分解成一个个的subproblem的话就可以得到答案了,但由于其加上了一定的限制条件,即不可以偷连续的两个房子,所以稍微改变一下想法,令f[i]为i个房子时能够偷盗的最大金额,那么如果不包括最后一个房子,那它就等价于f[i-1],如果包含最后一个房子,那么它就等价于f[i-2]+nums[i],所以我们只需要求解出这两种情况下的最大值时多少就可以了,f[i]=Max(f[i-2]+nums[i],f[i-1]),具体代码如下所示

class Solution {
public:
    int rob(vector<int>& nums) {
        int max= 0;
        int n=nums.size();
        if(n==0) return 0;
        int *f=new int[n];
        f[0]=nums[0];
        if(n==1) return nums[0]; 
        f[1]=Max(nums[0],nums[1]);
        max=f[1];
        for(int i=2;i<n;i++)
        {
            f[i]=Max((nums[i]+f[i-2]),f[i-1]);
            max = f[i];
        }
        return max;

    }
    int Max(int a,int b)
    {
        if (a>b) return a;
        return b;
    }
};

猜你喜欢

转载自blog.csdn.net/shine10076/article/details/82503273