lintcode392-打劫房屋

题目描述:

唯一约束是不能连续拿两个房间的钱,只能是隔一个或者更多。

此题可以利用动态规划的想法,利用一个数组arr, arr[i]表示i房间及其以前的可以拿到的最多金钱。

    此时针对第i个房间,就有两种情况:1)拿第i个房间的钱,那么就不能拿i-1房间,拿到的钱就是 arr[i-2] + A[i]

                                                    2)  不拿第i个房间的钱,那么可以拿到的最多金钱就是 arr[i-1]

    取两者较大值,就是arr[i]的值。即 arr[i] = max{arr[i-1], arr[i-2]+A[i]}.


再进一步分析可以看出,计算第i个位置的值时,只与i-1位置和i-2位置的值有关,与之前的都没有关系,所以可以精简到只用两个变量来保存中间结果,这样的话,就要有一个保存最终结果的变量res,在计算每一个位置的值的过程中,时刻更新最终结果res.

初始情况: 当只有一个房间时,能取得的最多金钱就是这个房间的金钱。

                   当有两个房间时,能取得就是两个房间中金钱较多的那一个。

代码:

long long houseRobber(vector<int> &A) {
        // write your code here
        if(A.empty())
            return 0;
        if(A.size() == 1)
            return A[0];
    
        long long first = A[0];
        long long second = max(A[0],A[1]);
    
        long long res = max(first, second);
        for(int i=2; i<A.size(); ++i){
            first = max(second, first + A[i]);
            if(first > res)
                res = first;
            swap(first, second);
        }
        return res;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值