[Programación dinámica LeetCode] Fighting Home II

Descripción del título

Eres un ladrón profesional y planeas robar casas a lo largo de la calle, cada habitación contiene una cierta cantidad de dinero en efectivo. Todas las casas en este lugar están en un círculo, lo que significa que la primera y la última casa están juntas. Al mismo tiempo, las casas vecinas están equipadas con un sistema antirrobo interconectado. Si un ladrón irrumpe en dos casas vecinas la misma noche, el sistema llamará automáticamente a la policía.
Dada una matriz entera no negativa que representa la cantidad de dinero almacenada en cada casa, calcule la cantidad máxima que puede robar sin tocar el dispositivo de alarma.
Ejemplos:

输入: [2,3,2]
输出: 3
解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

输入: [1,2,3,1]
输出: 4
解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

Enlace al título : https://leetcode-cn.com/problems/house-robber-ii/
Antes de hacer esta pregunta, primero puede hacer un robo a domicilio .

Ideas

Debido a que es circular, la primera casa y la última casa no pueden aparecer al mismo tiempo, también lo hacen dos planificación dinámica, el alcance de la primera planificación dinámica no incluye la última casa, el alcance de la segunda planificación dinámica no incluye la primera Para cada casa, tome el mayor de los dos resultados de planificación dinámica como la respuesta. El código es el siguiente:

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.empty()) return 0;
        if(nums.size()==1) return nums[0];  // 注意只有一个房屋的情况

        return max(doRub(nums, 0, nums.size()-2), doRub(nums, 1, nums.size()-1));
    }

    int doRub(vector<int> nums, int left, int right){
        int dp[nums.size()];
        memset(dp, 0, sizeof(dp));
        dp[left] = nums[left];
        for(int i=left+1; i<=right; i++){
            if(i==left+1){
                dp[i] = max(nums[left], nums[left+1]);
            }else{
                dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
            }
        }
        return dp[right];
    }
};
  • Complejidad del tiempo: O (n)
  • Complejidad espacial: O (n)

Supongo que te gusta

Origin www.cnblogs.com/flix/p/12733379.html
Recomendado
Clasificación