Registro de preguntas de algoritmo día 45 - Problema de mochila | 70. Subir escaleras (avanzado), 322. Intercambio de cambio, 279. Números cuadrados perfectos

70. Subir escaleras – LeetCode

Estado: AC tras comprobar las ideas.

Además de los convencionales uno o dos escalones que se pueden subir, cuando la pregunta se modifica ligeramente para permitir subir m escalones, la idea anterior del PD tiene limitaciones (dp[i] = dp[i-1] + dp[i -2), para resolver este tipo de problema, puedes convertir el problema en un problema completo de mochila. La cantidad de escaleras que se pueden subir son los elementos en la mochila y la cantidad total de escaleras es la mochila. Nota que, por ejemplo, los cinco pasos son 1, 2, 2 y 2, 2. 1 es un método diferente, por lo que de manera análoga al problema de ayer del número total de combinaciones, primero debemos atravesar la mochila y luego atravesar los elementos. La complejidad del tiempo En M)y la complejidad del espacio En)son las siguientes:

class Solution {
public:
    int climbStairs(int n) {
        // 转换为完全背包问题
        vector<int> dp(n+1, 0);
        dp[0] = 1;
        for(int i = 1; i <= n; ++i){ // 先背包
            for(int j = 1; j <= 2; ++j){ // 后物品(可以爬的台阶数,题目中是2)
                if(i-j >= 0) dp[i] += dp[i-j];
            }
        }
        return dp[n];
    }
};

322. Intercambio de cambios - LeetCode

Estado: verifique la idea y AC después de la depuración.

El código se muestra a continuación:

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1, INT_MAX);
        dp[0] = 0;
        int len = coins.size();
        for(int i = 0; i < len; ++i){
            for(int j = coins[i]; j <= amount; ++j){
                if(dp[j - coins[i]] != INT_MAX){
                    dp[j] = min(dp[j], dp[j-coins[i]]+1);
                }
            }
        }
        if(dp[amount] == INT_MAX) return -1;
        return dp[amount];
    }
};

279. Números cuadrados perfectos - LeetCode

Estado: verifique la idea y AC después de la depuración.

Preste atención a los detalles de implementación del método transversal de los primeros artículos, luego la mochila, la primera mochila y luego los artículos después de convertirlos en una mochila completa. Aquí están ambos códigos.

Primero los artículos, luego las mochilas:

class Solution {
public:
    int numSquares(int n) {
        // 完全平方数就是物品,总和就是背包,转换成一个无重复组合的完全背包问题
        vector<int> dp(n+1, INT_MAX);
        dp[0] = 0;
        for(int i = 1; i*i <= n; ++i){// 先物品
            for(int j = i*i; j <= n; ++j){
                dp[j] = min(dp[j], dp[j - i*i]+1);
            }
        }
        return dp[n];
    }
};

Primero la mochila, luego los artículos:

class Solution {
public:
    int numSquares(int n) {
        // 完全平方数就是物品,总和就是背包,转换成一个无重复组合的完全背包问题
        vector<int> dp(n+1, INT_MAX);
        dp[0] = 0;
        for(int i = 0; i <= n; ++i){// 先背包
            for(int j = 1; j*j <= i; ++j){
                if(dp[i - j*j] != INT_MAX){
                    dp[i] = min(dp[i], dp[i - j*j]+1);
                }
            }
        }
        return dp[n];
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_40395888/article/details/132488465
Recomendado
Clasificación