La espada se refiere a la oferta 90: robo de la casa del anillo

Pregunta:
Un ladrón profesional planea robar una casa en una calle circular, cada una de las cuales tiene una cierta cantidad de efectivo escondida. Todas las casas en este lugar están en un círculo, lo que significa que la primera y la última casa están una al lado de la otra. Al mismo tiempo, las casas adyacentes están equipadas con sistemas antirrobo interconectados.Si los ladrones irrumpen en dos casas adyacentes en la misma noche, el sistema emitirá una alarma automáticamente.
Dada una matriz de números enteros no negativos que representan la cantidad depositada en cada casa, calcule la cantidad máxima que se puede robar esta noche sin que salte la alarma.
Ejemplo 1:
Entrada: nums = [2,3,2]
Salida: 3
Explicación: No puedes robar la casa 1 (cantidad = 2) primero y luego la casa 3 (cantidad = 2) porque son adyacentes.
Ejemplo 2:
Entrada: nums = [1,2,3,1]
Salida: 4
Explicación: Puede robar la casa número 1 (cantidad = 1) primero, luego robar la casa número 3 (cantidad = 3).
Monto máximo robado = 1 + 3 = 4 .
Ejemplo 3:
Entrada: nums = [0]
Salida: 0
Análisis:
Esta pregunta es para cambiar el camino en la pregunta 89 en un anillo, y el final de la calle se considera adyacente. Este problema se puede descomponer en dos subproblemas: uno es pedirle a un ladrón la cantidad máxima de dinero que puede robar de la casa marcada 0 hasta el final de n-2, otro problema es encontrar la cantidad máxima de dinero que el ladrón puede robar de la casa con la marca 1 al final de la casa con la marca n-1, La cantidad máxima de dinero que un ladrón puede robar de una casa de 0 a n-1 es el máximo de estos dos subproblemas.
Código:

public class RobTwo {
    
    
    public int rob(int[] nums){
    
    
        if (nums.length == 0){
    
    
            return 0;
        }
        if (nums.length == 1){
    
    
            return nums[0];
        }
        int result1 = helper(nums,0,nums.length-2);
        int result2 = helper(nums,1,nums.length-1);
        return Math.max(result1,result2);
    }

    private int helper(int[] nums, int start, int end) {
    
    
        int[] dp = new int[2];
        dp[0] = nums[start];
        if (start<end){
    
    
            dp[1] = Math.max(nums[start],nums[start+1]);
        }
        for (int i = start + 2; i <= end; i++) {
    
    
            int j = i - start;
            dp[j%2] = Math.max(dp[(j-1)%2],dp[(j-2)%2]+nums[i]);
        }
        return dp[(end - start) % 2];
    }
}

Supongo que te gusta

Origin blog.csdn.net/Jiaodaqiaobiluo/article/details/122888389
Recomendado
Clasificación