Descripción del Título:
Se coloca un obsequio en cada casilla de un tablero de ajedrez m * n, y cada obsequio tiene un cierto valor (valor mayor que 0). Puede comenzar desde la esquina superior izquierda del tablero para obtener los regalos en la cuadrícula y moverse hacia la derecha o hacia abajo un cuadrado a la vez hasta llegar a la esquina inferior derecha del tablero . Dado el valor de un tablero de ajedrez y los obsequios que contiene, calcule el valor máximo de obsequios que puede obtener.
Ejemplo 1:
Entrada:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Salida: 12
Explicación: Ruta 1 → 3 → 5 → 2 → 1 puede obtener el mayor valor regalo de uno
提示 :
0 <grid.length <= 200
0 <grid [0] .length <= 200
Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.
Ideas de resolución de problemas:
El problema de dp más básico, solo necesita averiguar la ecuación de transferencia de acuerdo con el título.
Debido a que el título requiere solo un cuadrado hacia la derecha o uno hacia abajo , no es difícil para nosotros derivar la ecuación de transferencia.
dp [i] [j] = max (dp [i-1] [j] + cuadrícula [i] [j], dp [i] [j-1] + cuadrícula [i] [j]) i> 0 && j> 0
Y porque cuando i = 0, en la primera fila, su valor de dp solo se puede obtener moviéndose hacia la derecha, entonces: dp [i] [j] = dp [i] [j-1] + grid [i] [ j] i == 0 && j> 0
Cuando j = 0, en la primera columna, su valor dp solo se puede obtener moviéndolo hacia abajo, entonces: dp [i] [j] = dp [i-1] [j] + grid [i] [j] i> 0 && j == 0
El punto de partida es la esquina superior izquierda, es decir, cuando i == 0 && j == 0 , entonces dp [i] [j] = grid [i] [j]
Entonces obtenemos la siguiente ecuación de transferencia detallada:
① Punto de partida: i == 0 && j == 0 dp [0] [0] = cuadrícula [0] [0]
②La primera línea: i == 0 && j> 0 dp [i] [j] = dp [i] [j-1] + grid [i] [j] solo se puede alcanzar moviéndose hacia la derecha
③La primera columna: i> 0 && j == 0 dp [i] [j] = dp [i-1] [j] + grid [i] [j] solo se puede mover hacia abajo para alcanzar
④Situación general: i> 0 && j> 0 dp [i] [j] = max (dp [i-1] [j] + grid [i] [j], dp [i] [j-1] + grid [i] [j]) se puede alcanzar moviendo hacia la derecha y hacia abajo
Nota: este problema también se puede resolver usando DFS
Código:
public class jianzhi_Offer_47 {
public int maxValue(int[][] grid){
if (grid.length == 0){
return 0;
}
int[][] dp = new int[grid.length][grid[0].length];
dp[0][0] = grid[0][0];
for(int i = 0; i < grid.length; i++){
for (int j = 0; j < grid[i].length; j++){
if(i == 0 && j > 0){
dp[i][j] = dp[i][j-1] + grid[i][j];
}
else if(j == 0 && i > 0){
dp[i][j] = dp[i - 1][j] + grid[i][j];
}
else if(i > 0 && j > 0) {
dp[i][j] = Math.max(dp[i - 1][j] + grid[i][j], dp[i][j - 1] + grid[i][j]);
}
}
}
return dp[grid.length - 1][grid[0].length - 1];
}
public static void main(String[] args) {
jianzhi_Offer_47 obj = new jianzhi_Offer_47();
int[][] grid = new int[][]{
{
1,2,3,4,5},{
1,3,5,2,3},{
3,1,2,5,4},{
4,3,3,5,4}
};
System.out.println(obj.maxValue(grid));
}
}