[Entrenamiento de novatos] La espada se refiere a la Oferta 47. El valor máximo de los obsequios (dp básico)

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));
    }
}

Supongo que te gusta

Origin blog.csdn.net/Puppet__/article/details/115249354
Recomendado
Clasificación