lintcode392-打劫房屋

题目描述:

lintcode392-打劫房屋_第1张图片

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

此题可以利用动态规划的想法,利用一个数组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 &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 res)
                res = first;
            swap(first, second);
        }
        return res;
    }

你可能感兴趣的:(lintcode)