Directorio de artículos
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:
- Derecha -> Derecha -> Abajo -> Abajo
- 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];
}
}