Tabla de contenido
Fuente del tema: https://leetcode-cn.com/problems/integer-break
Descripción del Título
Dado un número entero positivo n, divídalo en la suma de al menos dos enteros positivos y maximice el producto de estos números enteros. Devuelve el producto más grande que pueda obtener.
Ejemplo 1:
Entrada: 2
Salida: 1
Explicación: 2 = 1 + 1, 1 × 1 = 1.
Ejemplo 2:
Entrada: 10
Salida: 36
Explicación: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36.
Explicación: puede suponer que n no es menor que 2 ni mayor que 58.
Idea general
- Problemas clásicos de programación dinámica
- Cinco pasos de programación dinámica:
- Determine el significado de la matriz dp y los subíndices: dp [i] representa el valor máximo del producto de i
- 确定 递推 公式 :
dp [i] = {max (j ∗ (i - j), j ∗ dp [i - j]) dp [i] = \ left \ {\ begin {array} {c} max (j * (ij), j * dp [ij]) \ end {matriz} \ right.d p [ i ]={ m a x ( j∗( yo-j ) ,j∗d p [ i-j ] )
- seguir adelante
- Cómo definir e inicializar la matriz dp
- Cuando dp [0] y dp [1] son 0, son inseparables cuando n son estos dos números.
- Determinar el orden transversal
- i se puede atravesar directamente desde el subíndice 2 (i∈ [2, n]), j se atraviesa de 1 a i, j∈ [1, i)
- Ejemplo para derivar una matriz dp
- Cómo definir e inicializar la matriz dp
Programación dinámica
- A través del recorrido de j, cuando actualizamos continuamente n = i, obtenemos el valor máximo del producto después de obtener todos los métodos de división, y luego lo actualizamos a dp [i], y finalmente damos salida a dp [n]
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n + 1, 0);
for(int i = 2 ; i <= n; ++i){
int maxCount = 0;
for(int j = 1 ; j < i ; ++j){
maxCount = max(maxCount, max(j * (i - j), j * dp[i - j]));
}
dp[i] = maxCount;
}
return dp[n];
}
};
Análisis de complejidad
- Complejidad del tiempo: O (n ^ 2). n es la longitud de la matriz
- Complejidad espacial: O (n). n es la longitud de la matriz