63. Rutas únicas II y 64. Suma mínima de ruta


Esta vez el tema del cepillado dp es muy sencillo.

1 63 caminos únicos II

1.1 Descripción del título

Un robot está ubicado en la esquina superior izquierda de la cuadrícula amxn (marcado como 'Inicio' en el diagrama a continuación).

El robot solo puede moverse hacia abajo o hacia la derecha en cualquier momento. El robot está tratando de llegar a la esquina inferior derecha de la cuadrícula (marcada como 'Finalizar' en el diagrama a continuación).

Ahora considere si se agregan algunos obstáculos a las cuadrículas. ¿Cuántos caminos únicos habría?

Un obstáculo y un espacio se marcan como 1 y 0 respectivamente en la cuadrícula.

Entrada: cuadrícula de matriz entera, que representa una cuadrícula mxn, cuadrícula [i] [j] = 1 significa obstáculos y no se puede pasar, cuadrícula [i] [j] = 0 significa pasable.
Salida: el número de rutas únicas que
pueden ir desde la esquina superior izquierda a la esquina inferior derecha Regla: solo ir hacia abajo o hacia la derecha

Entrada: obstacleGrid = [[0,0,0], [0,1,0], [0,0,0]]
Salida: 2
Explicación: Hay un obstáculo en el medio de la cuadrícula 3x3 de arriba.
Hay dos formas de llegar a la esquina inferior derecha:

  1. Derecha -> Derecha -> Abajo -> Abajo
  2. Abajo -> Abajo -> Derecha -> Derecha

1.2 Solución de programación dinámica

class Solution {
    
    
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
    
    
        if(obstacleGrid[0][0]==1) return 0;
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];
        dp[0][0] = (obstacleGrid[0][0]==1?0:1);
        for(int j=1;j<n;j++){
    
    
            dp[0][j]= (obstacleGrid[0][j]==1?0:dp[0][j-1]);
        }
        for(int i=1;i<m;i++){
    
    
            dp[i][0] = (obstacleGrid[i][0]==1?0:dp[i-1][0]);
        }
        for(int i=1;i<m;i++){
    
    
            for(int j=1;j<n;j++){
    
    
                dp[i][j] = (obstacleGrid[i][j]==0?dp[i-1][j]+dp[i][j-1]:0);
            }
        }
        return dp[m-1][n-1];
    }
}

2 64. Suma de ruta mínima

2.1 Comprensión del sujeto

Dada la cuadrícula amxn llena de números no negativos, busque una ruta de arriba a la izquierda a la parte inferior derecha, que minimice la suma de todos los números a lo largo de su ruta.

Nota: Solo puede moverse hacia abajo o hacia la derecha en cualquier momento
Entrada: cuadrícula de matriz de enteros, que representa un cuadrado de mxn, cuadrícula [i] [j] que representa el costo de pasar el cuadrado.
Salida: el costo mínimo
que puede ir desde la esquina superior izquierda a la esquina inferior derecha Regla: Solo ir hacia abajo o hacia la derecha
Entrada: cuadrícula = [[1,3,1], [1,5,1], [4,2 , 1]]
Salida: 7
Explicación: Porque la ruta 1 → 3 → 1 → 1 → 1 minimiza la suma.

2.2 Programación dinámica

class Solution {
    
    
    public int minPathSum(int[][] grid) {
    
    
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = new int[m][n];
        dp[0][0] = grid[0][0];
        for(int i=1;i<m;i++){
    
    
            dp[i][0] = dp[i-1][0]+grid[i][0];
        }
        
        for(int j=1;j<n;j++){
    
    
            dp[0][j] = dp[0][j-1]+grid[0][j];
        }
        
        for(int i=1;i<m;i++){
    
    
            for(int j=1;j<n;j++){
    
    
                dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1])+grid[i][j];
            }
        }
        
        return dp[m-1][n-1];
    }
}

Supongo que te gusta

Origin blog.csdn.net/flying_all/article/details/111939332
Recomendado
Clasificación