Sea C [math] (n, m) [/ math] el número de formas de escribir [math] n [/ math] como una suma ordenada de enteros positivos que no exceden [math] m [/ math].
La forma básica de encontrar una recurrencia / resolver un problema de conteo usando programación dinámica es la siguiente:
Primero, imagina construir la solución de forma incremental, como una secuencia de pasos. Aquí, esto es natural, podemos elegir un elemento de la suma a la vez, de izquierda a derecha.
Luego, considera todas las posibilidades de lo que sucede en el primer paso. El primer número [matemático] i [/ matemático] que elijamos estará entre 1 y [matemático] \ min (n, m) [/ matemático], inclusive. (Por lo general, será entre 1 y [matemáticas] m [/ matemáticas], inclusive, pero para las pequeñas [matemáticas] n [/ matemáticas] también debemos asegurarnos de no exceder eso).
- ¿[Math] x ^ 2-kxy + y ^ 2 = -1 [/ math] tiene soluciones enteras solo cuando [math] k = 3 [/ math]? ¿Cómo pruebo esto?
- Sea [math] S [/ math] la suma de los primeros [math] 2015 [/ math] términos de la secuencia [math] 1,2,2,3,3,3 \ cdots n, n \ cdots n. [/ math], donde [math] n [/ math] ocurre [math] n [/ math] veces. Entonces, ¿cuál es el valor de [matemáticas] S [/ matemáticas]?
- ¿Cuál es el resto de [matemáticas] (75 ^ {80}) / 7? [/ Matemáticas]
- ¿Qué trasfondo se necesita para estudiar la teoría de números analíticos?
- ¿Cuál es el valor esperado del mínimo común múltiplo de [math] N [/ math] enteros elegidos uniformemente entre [math] [0, M] [/ math]?
Cada elección de [math] i [/ math] nos da un conjunto diferente de soluciones. Más precisamente, esos conjuntos de soluciones son mutuamente disjuntos. Por lo tanto, podemos contar el número de soluciones en cada caso por separado, y luego simplemente las sumamos.
Entonces, veamos un caso particular. El primer elemento de la suma es [math] i [/ math]. Para finalizar la suma, tenemos que escribir [math] ni [/ math] como una suma de elementos que no exceda [math] m [/ math]. ¿Luce familiar? Debería, porque es el mismo problema que antes. Usando nuestra notación, hay formas [math] C (ni, m) [/ math] de hacerlo.
Esto nos lleva a la siguiente recurrencia:
- caso base: [matemática] C (0, m) = 1 [/ matemática], la única forma es la suma vacía
- caso recursivo: [matemática] \ forall n> 0: C (n, m) = \ sum_ {i = 1} ^ {\ min (n, m)} C (ni, m) [/ math]
La evaluación de la recurrencia anterior lleva tiempo [matemático] O (nm) [/ matemático]. Hay una manera simple de optimizar el cálculo a [matemáticas] O (n) [/ matemáticas], lo dejaré como un ejercicio para el lector 🙂