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 y la complejidad del espacio 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];
}
};