[Reflexión] 343 descanso entero

Solicitud

  • Dado un número positivo n, puede dividirlo en la suma de múltiples números y encontrar el método de división que maximice el producto de estos números (al menos dividido en dos números)

Ejemplos

  • n = 2, devuelve 1 (2 = 1 + 1)
  • n = 10, devuelve 36 (10 = 3 + 3 + 4)

Lograr

  • Recorrido hacia atrás (n ^ 2, tiempo de espera)

1  clase Solución {
 2  privado :
 3      int max3 ( int a, int b, int c) {
 4          return max (a, max (b, c));
 5      }
 6      
7      // divide n (al menos dos partes) El producto máximo que se puede obtener es 
8      int breakInteger ( int n) {
 9          
10          if (n == 1 )
 11              return  1 ;
 12              
13          int res = -1 ;
 14          for ( inti = 1 ; i <= n- 1 ; i ++ )
 15              // i + (ni) 
16              res = max3 (res, i * (ni), i * breakInteger (n- i));
17          
18          return res;
19      }
 20  
21  public :
 22      int integerBreak ( int n) {
 23          return breakInteger (n);
24      }
 25 };
Ver código
  • Búsqueda de memoria
 Solución de 1 clase {
 2  privado :
 3      vector < int > memo;
 4      
5      int max3 ( int a, int b, int c) {
 6          return max (a, max (b, c));
 7      }
 8      
9      // will n El producto máximo que se puede obtener dividiendo (al menos dos partes) 
10      int breakInteger ( int n) {
 11          
12          if (n == 1 )
 13              return  1 ;
 14          
15          if(memo [n]! = - 1 )
 16              return memo [n];
17                  
18          int res = - 1 ;
19          para ( int i = 1 ; i <= n- 1 ; i ++ )
 20              // i + (ni) 
21              res = max3 (res, i * (ni), i * breakInteger (n- i));
22          memo [n] = res;
23          devoluciones res;
24      }
 25  
26  público :
 27      int integerBreak ( int n) {
28          memo = vector < int > (n + 1 , - 1 );
29          return breakInteger (n);
30      }
 31 };
Ver código
  • Programación dinámica
 Solución de 1 clase {
 2  privado :
 3      int max3 ( int a, int b, int c) {
 4          return max (a, max (b, c));
 5      }
 6  
7  público :
 8      int integerBreak ( int n) {
 9          afirmar (n> = 2 );
 10          
11          // memo [i] significa el producto máximo obtenido dividiendo al menos el número i (al menos dos partes) 
12          vector < int > memo (n + 1 , -1 );
 13         
14          memo [ 1 ] = 1 ;
15          para ( int i = 2 ; i <= n; i ++ )
 16              // 求解 memo [j] 
17              para ( int j = 1 ; j <= i- 1 ; j ++ )
 18                  // j + ( ij) 
19                  memo [i] = max3 (j * (ij), j * memo [i- j], memo [i]);
20          
21          memorando de regreso [n];
22      }
 23 };
Ver código

Relacionados

  • 279 cuadrados perfectos
  • 91 formas de decodificación
  • 62 caminos únicos
  • 63 caminos únicos II

Supongo que te gusta

Origin www.cnblogs.com/cxc1357/p/12717372.html
Recomendado
Clasificación