algoritmo dp - POJ 4119: número entero complejo problema de división

título

límite de tiempo total: 200 ms límite de memoria: 65536kB
describe
un número entero positivo y n representa una serie de números enteros positivos y, n = n1 + n2 + ... + nk, donde n1> = n2> = ...> = nk> = 1, k> = 1 .
Esto representa un número entero positivo n es un entero positivo n se llama partición.

Input
entrada estándar que comprende una pluralidad de conjuntos de datos de prueba. Cada prueba es una línea de datos de entrada, que comprende dos números enteros N y K.
(0 <n <= 50, 0 <k <= N)
de salida
para cada prueba, los siguientes tres líneas de salida de datos:
primera línea: N se divide en un número de enteros positivos K y la
segunda fila: división N el número se divide en varios números enteros positivos diferentes y la
tercera fila: N se divide en un número impar y el número de la división de enteros positivos
muestra de entrada
52
de salida de muestra de
2
3.
3.
Tip
primera línea: 4 + 1, 3 + 2,
segunda línea: 5,4 + 1,3 + 2
línea 3: 1 + 5,1 + 3, 1 + 1 + 1 + 1 + 1 + 1

En primer lugar pidió

El problema número entero de partición que el problema antes de una restricción de K, este problema puede ser analogía al problema de la mochila, el problema se convierte en la siguiente:
seleccionar el número K [1 ... N], y que es N, y se selecciona de el número se puede repetir, que es un problema típico de programación dinámica.
Considere entonces los subproblemas, a partir de [i 1 ...] número q seleccionado, y que es J.
Orden f [i] [j] [ q] Soluciones subproblemas figura.
Considere las siguientes condiciones de contorno: la selección de un número de una [1 ... 1], que es 1, el único método seleccionado del grupo f [1] [1] [ 1] = 1;
próxima considerar una transición de estado:
F [I] [J] [Q] = F [. i- 1] [J] [Q] + F [i] [j - i] [Q -. 1]
[. i- 1] F [J] [Q] denota la TH I el número no se selecciona, a continuación, para seleccionar el número q de la anterior i-1, y que es J
F [i] [j - i] [q-1] denota el i-ésimo seleccionado, entonces la parte delantera seleccionado número i q-1 a, y que es JI, donde i es no i-1 se toma porque en cuestión será utilizado en el sub-i, es decir, cada número seleccionado no es único,
es un caso especial del problema general mochila.
De esta manera, la solución de este problema utilizando un grupo de tres dígitos al proceso de planificación dinámica de registro puede ser, pero un poco de planificación es matrices dinámicas se pueden utilizar para desplazamiento para ahorrar espacio, este camino puede ser.
Supongamos que un grupo de dos dígitos f [j] [q], con una capa de ciclo anterior i representa el número de seleccionado, antes del primer ciclo comenzó i, f [j] [q] representa el número de i-1 frente selecciona compensar la q j, para f [i] [ji] [ q-1]
porque poligonal antes de f [i] [j] [ q] a, la f [ji] valor [q-1] en es el i-ésimo ciclo el valor actualizado, de modo que la transición de estado puede ser simplificada a:
F [J] [Q] + = F [JI] [-Q 1.]
esta parte del código como sigue:

dp[0][0] = 1;
for (int i = 1; i <= n; i++)
    for (int j = i; j <= n; j++)
	for (int q = k; q >= 1; q--)
	    dp[j][q] += dp[j - i][q - 1];
printf("%d\n", dp[n][k]);

La segunda pregunta

La segunda pregunta antes de un aumento de la simple problema división entera digital no se puede repetir límite, que se refleja en la ecuación de transición de estado está en el interior:
conjunto f [i] [j] denota el número de la anterior de hash i j,
ecuación de transición de estado:
F [i] [j] = f [i-1] [ji] + f [i-1] [j]
del mismo modo, de dos dimensional array se puede desplazar en una dimensión de notar que j en descendente traverse
el código:

dp1[0] = 1;
        for (int i = 1; i <= n; i++)
            for (int j = n; j >= i; j--)
                dp1[j] += dp1[j - i];
        printf("%d\n", dp1[n]);

tercera pregunta

Después de la tercera cuestión que un simple aumento de la división entera problema sólo puede elegir un número impar positivo, nota, digital repiten, comprender este hecho, las dos primeras preguntas es muy bueno para escribir
directamente a escribir la ecuación de transición de estado:
f [ i] [j] = F [i] [j - I] + F [I-2] [J]
... F [1] [1] = 1
por laminación la matriz, entonces, tomo traversal impar, j requerida de pequeño a grande para atravesar .
código:

dp2[0] = 1;
        for (int i = 1; i <= n; i += 2)
            for (int j = i; j <= n; j++)
                dp2[j] += dp2[j - i];
        printf("%d\n", dp2[n]);

Código preguntas enteras:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

typedef long long ll;

const int N = 50 + 5;
int dp[N][N], dp1[N], dp2[N];

int main() {
    for (int n, k; scanf("%d%d", &n, &k) == 2;) {
        memset(dp, 0, sizeof(dp));
        memset(dp1, 0, sizeof(dp1));
        memset(dp2, 0, sizeof(dp2));
        dp[0][0] = 1;
        for (int i = 1; i <= n; i++)
            for (int j = i; j <= n; j++)
                for (int q = k; q >= 1; q--)
                    dp[j][q] += dp[j - i][q - 1];
        printf("%d\n", dp[n][k]);
        dp1[0] = 1;
        for (int i = 1; i <= n; i++)
            for (int j = n; j >= i; j--)
                dp1[j] += dp1[j - i];
        printf("%d\n", dp1[n]);
        dp2[0] = 1;
        for (int i = 1; i <= n; i += 2)
            for (int j = i; j <= n; j++)
                dp2[j] += dp2[j - i];
        printf("%d\n", dp2[n]);
    }
    return 0;
}

Código de Referencia: https://blog.csdn.net/Nightmare_ak/article/details/94414363

Supongo que te gusta

Origin www.cnblogs.com/zhangyue123/p/12557503.html
Recomendado
Clasificación