leetcode House Robber II

动态规划:假设抢到第i个房间了, money[i] = max(num[i] + money[i-2],  money[i-1]); 因为是一个圈,要记录i是来自哪里,用于判断最后一个的最大值是否来自最开始的那个(ffuckk,不会描述)

vector<int> money;

    vector<int> pre_index;//记录当前这个钱 是从哪个房间来的
    int lenght;
    
    int findInitIndex(int index)
    {
        while(pre_index[index] != -1)
        {
            index = pre_index[index];
        }
        return index;
    }
    
    int rob(vector<int>& nums)
    {
        if(nums.empty())
            return 0;
        
        lenght = nums.size();
        if(1 == lenght)
            return nums[0];
        if(2 == lenght)
            return max(nums[0], nums[1]);
    
        
        money.resize(lenght);
        pre_index.resize(lenght);
    
        int max_money = -1;
    
        for(int begin = 0; begin < lenght; ++begin)
        {
            money.clear();
            pre_index.clear();
    
            money[begin] = nums[begin];
            pre_index[begin] = -1;
    
            int next = (begin + 1) % lenght;
            if(nums[next] > money[begin]){
                money[next] = nums[next];
                pre_index[next] = -1;
            }else{
                money[next] = nums[begin];
                pre_index[next] = begin;
            }
    
            int current_begin = begin;
            int last_last, last, current;
            /*对剩余的 k-2 进行遍历*/
            for(int i = 0; i < lenght - 2; ++i)
            {
                last_last = current_begin % lenght;
                last = (current_begin + 1) % lenght;
                current = (current_begin + 2) % lenght;
    
                if(nums[current] + money[last_last] > money[last]){
                    money[current] = nums[current] + money[last_last];
                    pre_index[current] = last_last;
                }else{
                    money[current] = money[last];
                    pre_index[current] = last;
                }
                ++current_begin;
            }
            /*
             * 此时 current是 从begin开始遍历的最后一个。 他俩是相邻的,一个头 一个尾
             * 如果 current的money值 是从 begin开始的,则应该取上一个作为最大值
             **/
            if(findInitIndex(current) == begin){
                max_money = max(max_money, money[last]);
            }else{
                max_money = max(max_money, money[current]);
            }
        }
    
        return max_money;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值