Oferta de Jianzhi 14- I. Cortar la cuerda
Descripción del Título
Ideas para resolver problemas
dp
Solución de referencia: programación dinámica, matemáticas
Esta pregunta es una variante de 343. Integer Split , la pregunta oficial se explica claramente.
Tiempo o (n²), espacio o (n)
class Solution {
public int cuttingRope(int n) {
//定义:dp[i]表示对于长度为i的绳子,剪成至少两段后可能的最大乘积
int[] dp = new int[n + 1];
//base case
dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j < i; j++) {
//两种选择:每次将 i - j 剪出来后,剩下的 j 的部分选择不剪或继续剪
dp[i] = Math.max(dp[i], Math.max(j * (i - j), dp[j] * (i - j)));
}
}
return dp[n];
}
}
matemáticas
Conclusión: cuanto más cerca esté el entero dividido de e, mayor será el producto.
Categorice la discusión de acuerdo con los resultados de n% 3: (suponga que m = n / 3)
- Si n% 3 == 0, divídalo en m 3
- Si n% 3 == 1, divídalo en m-1 3 y 2 2
- Si n% 3 == 2, divida en m 3 y 1 2
La discusión anterior es cuando n ≥ 4, y no es aplicable cuando n ≤ 3, por lo que debe discutirse por separado:
- Si n = 2, hay 2 = 1 + 1 y el producto máximo es 1.
- Si n = 3, hay 3 = 1 + 1 + 1 = 1 + 2 dos casos, el producto máximo es 2,
por lo tanto, se puede combinar en el producto máximo = n-1
Tiempo o (1), espacio o (1)
consejos: para operaciones con números enteros y restantes, los números enteros que no superen el número de máquinas se pueden considerar como O (1);
class Solution {
public int cuttingRope(int n) {
if (n <= 3) {
return n - 1;
}
int quotient = n / 3;
int remainder = n % 3;
if (remainder == 0) {
return (int)Math.pow(3, quotient);
} else if (remainder == 1) {
return (int)Math.pow(3, quotient - 1) * 4;
} else {
return (int)Math.pow(3, quotient) * 2;
}
}
}