【LeetCode】Entrenamiento de programación dinámica (3)

931. Suma mínima de caminos descendentes

Haga clic para ver: La suma mínima de la ruta descendente


Dada una matriz de matriz de enteros cuadrados nxn, encuentre y devuelva la suma mínima de las rutas descendentes a través de la matriz.
La ruta descendente puede comenzar desde cualquier elemento en la primera fila y seleccionar un elemento de cada fila. El elemento seleccionado en la siguiente fila está como máximo a una columna del elemento seleccionado en la fila actual (es decir, el primer elemento directamente debajo o en diagonal a la izquierda o a la derecha). Específicamente, el siguiente elemento en la posición (fila, columna) debe ser (fila + 1, columna - 1), (fila + 1, columna) o (fila + 1, columna + 1).

Entrada: matriz = [[2,1,3],[6,5,4],[7,8,9]]
Salida: 13
Explicación: Como se muestra en la figura, hay dos caminos descendentes con mínimo y

análisis de tema

Cuando está en la posición (fila, columna), la fila siguiente puede seleccionar el elemento en la posición (fila+1, columna) / posición (fila+1, columna-1) / posición (fila+1, columna+1)

ecuación de transición de estado

dp[i][j]: Indica el recorrido mínimo descendente desde la posición de la primera fila hasta la posición [i, j]

Divide el problema según el paso más reciente.


La posición [i, j] se puede mover hacia abajo por la posición [i-1, j-1] / la posición [i-1, j] / la posición [i-1, j+1]

Por lo que se puede dividir en tres situaciones:


El primer caso:
baje de la posición [i-1, j-1] a la posición [i, j]
Si desea obtener la ruta descendente mínima en la posición [i, j], primero debe obtener [i-1, La trayectoria descendente mínima en la posición j-1] es dp[i-1, j-1]
más la trayectoria en la posición [i, j] , es decir, la posición en [i, j] en el primer caso de ob[ i, j ]
El camino descendente mínimo es: dp[i-1,j-1]+ob[i,j]


El segundo caso:
baje de la posición [i-1, j] a la posición [i, j]
Si desea obtener la ruta descendente mínima de la posición [i, j], primero debe obtener [i-1, j] La mínima trayectoria descendente de la posición es dp[i-1,j]
más la trayectoria de la posición [i,j] es ob[i,j]
En el segundo caso, la mínima trayectoria descendente de la posición [i,j] es: dp [i-1,j]+ob[i,j]


El tercer caso:
baje de la posición [i-1, j+1] a la posición [i, j]
Si desea obtener la ruta descendente mínima de la posición [i, j], primero debe obtener [i -1, La trayectoria descendente mínima en la posición j+1] es dp[i-1,j+1]
más la trayectoria en la posición [i,j] es ob[i,j]
En el tercer caso, la trayectoria en la posición [i,j] El camino descendente mínimo es: dp[i-1,j+1]+ob[i,j]


Ecuación de transición de estado:
dp[i][j]= min( dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1] )+ob (i,j);

código completo

class Solution {
    
    
public:
    int minFallingPathSum(vector<vector<int>>& ob) {
    
    
       
       int m=ob.size();
       int n=ob[0].size();
       //dp数组 扩列一行 两列
       //并将 m+1 个 vetcor 数组 的n+2个值 都初始化为正无穷大
       vector<vector<int>>dp(m+1,vector<int>(n+2,INT_MAX));
       //将dp 扩列的第一行初始化为0
      // dp[0].resize(n+2,0);
      int i=0;
       int j=0;
      for(j=0;j<n+2;j++)
      {
    
    
          dp[0][j]=0;
      }
       
       for(i=1;i<=m;i++)
       {
    
    
           //从[1,1]位置开始到[i,n]位置结束
           for(j=1;j<=n;j++)
           {
    
    
               //ob作为原数组,dp作为扩列数组
               //使用dp扩列的下标 寻找ob对应的原数组下标 行需减1 列减1
               dp[i][j]= min(min(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1])+ob[i-1][j-1];
           }
       }

     //寻找dp数组的最后一行的最小值
      int minsize=INT_MAX;
      for(j=1;j<=n;j++)
      {
    
    
         if(minsize>dp[m][j])
         {
    
    
             minsize=dp[m][j];
         }
      } 
     // 返回dp数组的最后一行的最小值
      return minsize;
    }
};

Para la matriz original, usar la ecuación de transición de estado en el área azul causará un problema fuera de los límites, por lo que este problema se resuelve expandiendo la columna


La primera fila de la matriz original solo puede ir de la posición actual a la posición actual, por lo que el valor del elemento de la matriz original se almacena
para proteger el valor de la primera fila de la matriz original, por lo que la primera fila de la matriz expandida es todo 0

Si la posición de la columna de expansión restante se inicializa en 0, interferirá con el resultado de la comparación, por lo que para no afectar la selección, establezca su valor en infinito positivo


Por ejemplo: 6 es la posición [i, j], si desea obtener la ruta mínima, debe buscar hacia abajo y debe llegar a la posición 2, pero debido al 0 que aparece después de la expansión,
obtendrá elija 0, lo que conducirá a un error en el resultado

64. Suma de ruta mínima

Haga clic para ver: ruta mínima y


Dada una cuadrícula mxn de enteros no negativos, busque una ruta desde la esquina superior izquierda hasta la esquina inferior derecha que minimice la suma de los números en la ruta.
Nota: Solo muévase hacia abajo o hacia la derecha un paso a la vez.

Entrada: grid = [[1,3,1],[1,5,1],[4,2,1]]
Salida: 7
Explicación: Debido a que la suma de la ruta 1→3→1→1→1 es el mas pequeño.

análisis de tema

Solo puede ir hacia abajo o hacia la derecha cada vez.
Encuentre la ruta mínima desde la esquina superior izquierda hasta la esquina inferior derecha y
la ruta mínima en la figura es: 1+3+1+1+1=7


ecuación de transición de estado

dp[i][j]: Indica la suma mínima de ruta en este momento desde la posición inicial (esquina superior izquierda) hasta la posición [i, j]

Divide el problema según el paso más reciente.


Para llegar a la posición [i, j], solo puede bajar un paso desde la posición [i-1, j]
o un paso hacia la derecha desde la posición [i, j-1]

Entonces dp[i][j] se divide en dos casos:


El primero obtiene la posición [i, j] hacia abajo desde la posición [i-1, j]

Si desea obtener la ruta mínima en la posición [i,j], primero debe obtener la ruta mínima en la posición [i-1,j], es decir, dp[i-1,j] más el valor
de la array original ob correspondiente a la posición [i,j] Es decir , la suma mínima de caminos de la posición [i, j] en el primer caso de ob [i, j] es: dp[i-1, j]+ob[ yo, j]


El segundo da un paso a la derecha desde la posición [i, j-1] para llegar a la posición [i, j]

Si desea obtener la ruta mínima en la posición [i, j], primero debe obtener la ruta mínima en la posición [i, j-1], es decir, dp[i, j-1] más el valor
de la matriz original ob correspondiente a la posición [i, j] Es decir , la suma mínima de caminos de la posición [i, j] en el segundo caso de ob[ i, j] es: dp[i, j-1]+ob[ yo, j]


La ecuación de transición de estado es:
dp[i][j] = min( dp[i-1][j],dp[i][j-1] )+ob[i,j];

código completo

class Solution {
    
    
public:
    int minPathSum(vector<vector<int>>& ob) {
    
    
          int m=ob.size();//行
          int n=ob[0].size();//列
          //将m+1个 vector数组 的n+1个值 设置为正无穷大
          //dp数组 将ob原数组 扩一行 和一列
          vector<vector<int>>dp(m+1,vector<int>(n+1,INT_MAX));
          int i=0;
          int j=0;
          //起点位置对应的上一个位置和左一个位置设置为0
          dp[0][1]=0;
          dp[1][0]=0;

          for(i=1;i<=m;i++)
          {
    
    
              for(j=1;j<=n;j++)
              {
    
    
                  //ob作为原数组 dp作为扩列数组
                  //通过扩列数组的下标 寻找原数组对应的下标 需行减1 列减1
                  dp[i][j]=min(dp[i-1][j],dp[i][j-1])+ob[i-1][j-1];
              }
          }
         // 由于dp是扩列数组 返回右下角 
          return dp[m][n];
          
    }
};

Inicialización
Si se usa la ecuación de transición de estado, la primera fila y la primera columna de la matriz original pueden tener un problema fuera de los límites, por lo que para evitar este problema, expanda la matriz original en una fila y una columna.

inserte la descripción de la imagen aquí

Debido a que no hay una posición anterior o una posición izquierda en este momento, el valor de la posición de inicio (inicio) de la matriz dp debe ser
el valor . Para no afectar el resultado, la anterior la posición correspondiente al inicio y la posición izquierda se establecen en 0


Si el valor anterior del área roja se establece en 0, cuando se realiza la ecuación de transición de estado, este 0 se tomará para interferir con el resultado, por lo que para no
afectar el resultado, configúrelo en infinito positivo.


Las posiciones restantes también son las mismas que la anterior, lo que interferirá con los resultados, por lo que para evitar afectar los resultados, todas están configuradas en infinito positivo.

174. Juego de mazmorras

Haz clic para ver: Juego de mazmorras


Los demonios capturaron a la princesa y la encerraron en la esquina inferior derecha de la mazmorra. Una mazmorra es una cuadrícula bidimensional de mxn habitaciones. Nuestro heroico caballero se coloca inicialmente en la habitación superior izquierda, y debe abrirse camino a través de la mazmorra y salvar a la princesa luchando contra los demonios.
Los puntos de salud iniciales de un caballero son un número entero positivo. Si sus puntos de salud caen a 0 o menos en algún momento, muere instantáneamente.
Algunas habitaciones están protegidas por demonios, por lo que el caballero perderá puntos de vida al entrar en estas habitaciones (si el valor de la habitación es un número entero negativo, significa que el caballero perderá puntos de vida); otras habitaciones están vacías (el valor en la habitación es 0), o contienen bolas mágicas que aumentan los puntos de salud del caballero (si el valor en la habitación es un número entero positivo, significa que el caballero aumentará los puntos de salud).
Para rescatar a la princesa lo antes posible, el caballero decidió moverse solo un paso hacia la derecha o hacia abajo a la vez.
Devuelve los puntos de salud iniciales mínimos necesarios para garantizar que el caballero pueda salvar a la princesa.

Entrada: mazmorra = [[-2,-3,3],[-5,-10,1],[10,30,-5]]
Salida: 7
Explicación: Si el caballero sigue el mejor camino: Derecha -> Derecha -> Abajo -> Abajo, los puntos de salud iniciales del caballero son al menos 7.

análisis de tema

Comenzando desde la esquina superior izquierda y terminando en la esquina inferior derecha,
solo puede ir hacia abajo o hacia la derecha cada vez

-2 -> -3 -> 3 -> 1 -> -5


En la primera sala, se perderán 2 puntos de salud, por lo que el caballero necesita 3 puntos de salud para salir de la primera sala, pero en este momento para ingresar a la segunda sala, se perderán 3 puntos de salud, el caballero cuelga directamente Lost, por lo que los 3 puntos de salud iniciales no están permitidos

Salir de las dos primeras habitaciones requiere que el punto de vida inicial del caballero sea de 6 puntos (si el punto de vida es 0, morirá). En este momento, el punto de vida del caballero es de 1 punto. 3 puntos de vida, cambiado a 4 puntos
.
Cuando se termina la cuarta habitación, el caballero agrega 1 punto de vida, que se convierte en 5.
Cuando se llega a la última habitación, se pierden 5 puntos de vida y los puntos de vida del caballero son 0, colgado directamente .

Entonces, el volumen de sangre inicial del caballero debe ser de 7 puntos.

ecuación de transición de estado

Debido a que se juzga por el volumen de sangre inicial, y no solo se ve afectado por lo anterior sino también por detrás,
es necesario utilizar una determinada posición como punto de partida para resolver el problema.

dp[i][j] significa: comenzando desde la posición [i,j] y alcanzando el punto final, el valor almacenado es el mínimo requerido de puntos de salud iniciales

Divide el problema según el paso más reciente.


Posición [i, j], puede bajar un paso para llegar a la posición [i+1, j] o dar un paso a la derecha para llegar a la posición [i, j+1]

dp[i][j] se divide en dos casos:


El primer caso es moverse a la derecha desde la posición [i,j] a la posición [i,j+1]

Los puntos de salud de la posición [i, j] pueden garantizar que la posición [i, j+1] alcance el punto final, es decir, dp
[i][j] + ob[i][j] >= dp[ i][j+ 1]
dp[i][j]>= dp[i][j+1]-ob[i][j]
y dp[i][j] es el punto mínimo de salud, entonces dp[i ][j]= dp[i][j+1]-ob[i][j]


El segundo caso es bajar de la posición [i,j] a la posición [i+1,j]

Los puntos de salud de la posición [i, j] pueden asegurar que la posición [i+1, j] llegue al final, es decir,
dp [i][j] +ob[i][j] >= dp[i +1][ j]
dp[i][j]>= dp[i+1][j]-ob[i][j]
y dp[i][j] es el punto de salud mínimo, entonces dp[i ][j]= dp[i+1][j]-ob[i][j]


La ecuación de transición de estado es:
dp[i][j] = min(dp[i][j+1],dp[i+1][j])-ob[i][j];


Si ob[i][j] es demasiado grande, lo que resulta en un valor negativo de dp[i][j], no cumple con los requisitos, porque el punto de salud mínimo es 1

dp[i][j]=max(1,dp[i][j]);
Si dp[i][j] es negativo, reemplácelo con 1

código completo

class Solution {
    
    
public:
    int calculateMinimumHP(vector<vector<int>>& ob) {
    
    
      int m=ob.size();
      int n=ob[0].size();
      // 将 m+1个 vector 数组 的 n+1个值 都置为 正无穷大 
      vector<vector<int>>dp(m+1,vector<int>(n+1,INT_MAX));
     
    //从end位置走出来至少剩下1个健康点数
      dp[m-1][n]=1;
      dp[m][n-1]=1;
      int i=0;
      int j=0;
      for(i=m-1;i>=0;i--)
      {
    
    
          for(j=n-1;j>=0;j--)
          {
    
    
                dp[i][j]=min(dp[i][j+1],dp[i+1][j])-ob[i][j];
                //若dp[i][j]为负,将其置为1
                dp[i][j]=max(1,dp[i][j]);
          }
      }
      //dp[0][0]表示从起点位置开始,到终点至少需要多少初始健康点数
      return dp[0][0];
    }
};

Inicialización
De acuerdo con la ecuación de transición de estado, tanto la última fila como la fila más a la derecha desencadenarán un problema fuera de los límites, por lo tanto, expanda la matriz original en una fila y una columna

Después de salir de la posición final, debe quedar al menos 1 punto de salud.
Es posible dar un paso hacia abajo o dar un paso a la derecha.
Los puntos de salud que salen de la posición [i, j] pueden garantiza la posición [i, j+1] hasta el final,
por lo que ambas posiciones se establecen en 1


La posición actual del área roja debe compararse con la siguiente posición y la posición correcta para tomar la posición más pequeña,
pero la posición de abajo es virtual, por lo que no se puede contar; de lo contrario, interferirá con el resultado,
por lo que su posición es establecido en infinito positivo


Las posiciones restantes también son las mismas que la anterior, lo que interferirá con los resultados, por lo que para evitar afectar los resultados, todas están configuradas en infinito positivo.

Supongo que te gusta

Origin blog.csdn.net/qq_62939852/article/details/131368190
Recomendado
Clasificación