Programación Dinámica simple movimiento E- dormitorio (entrenamiento de invierno)

Objeto de la solicitud
para mover el dormitorio es muy cansado, xhd profunda. Tiempo remontar 9 de julio de 2006 el día xHD obligado a pasar de Edificio 27, Edificio 3, como el No. 10 para sellar el suelo. Parecía en el dormitorio donde n elementos, xHD comenzar en un sueño, porque n es un entero menor que 2000, es demasiado, por lo que decidió solo movimiento xHD 2 k piezas del pasado en la línea, pero todavía muy cansado, porque 2 no es pequeño k es n es un entero mayor que Afortunadamente xHD cada vez que se encontró que la fatiga es proporcional al cuadrado de la diferencia en el peso de la mano derecha del artículo (añadir aquí que, cada transferencia de dos cosas XHD basa en años de experiencia de mover cosas, una mano izquierda). Por ejemplo, el peso xhd mano izquierda del artículo 3, la mano derecha del peso del artículo 6, el grado de su fatiga del movimiento aquellos (6-3) ^ 2 = 9. ahora pobre xhd este movimiento los 2 gustaría saber la mejor condición después de los artículos lo k (es decir, la fatiga más bajo), por favor le dijera.
la entrada de
los datos de entrada en cada grupo hay dos líneas, la primera línea hay dos números n, k (2 <2 =
K <= n <2000). la segunda fila tiene n representan cada uno un número entero de n elementos en peso (peso de ser un número entero positivo más pequeño que 2 ^ 15).
la salida
correspondiente a cada entrada Datos, los datos de salida representa sólo un mínimo de su fatiga, cada fila.
La muestra de la entrada
2. 1
. 1. 3
la muestra de la salida
. 4
necesario durante todo el proceso de mínimo la fatiga, la dp primero valor de matriz asignado a un valor máximo, están dispuestos en una matriz cada valor, con el fin de tomar el artículo adyacente. DP [i] [j] denota los artículos frente i j artículo seleccionado fatiga mínima obtenida, la ecuación de transición dinámicadp[i][j] = min(dp[i - 1][j], dp[i - 2][j - 1] + (a[i] - a[i - 1]) * (a[i] - a[i - 1]));

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[2010][2010], a[2010];
#define maxn 0x3f3f3f3f
int main()
{
    int n, k;
    while (~scanf("%d%d", &n, &k))
    {
        int i, j;
        memset(a, 0, sizeof(a));
        memset(dp, 0, sizeof(dp));
        for (i = 0; i <= n; i++)
            for (j = 1; j <= k; j++)
                dp[i][j] = maxn;
        for (i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        sort(a, a + n + 1);
        for (i = 2; i <= n; i++)
            for (j = 1; j * 2 <= i; j++)
                dp[i][j] = min(dp[i - 1][j], dp[i - 2][j - 1] + (a[i] - a[i - 1]) * (a[i] - a[i - 1]));
        printf("%d\n", dp[n][k]);
    }
    return 0;
}
Publicado 38 artículos originales · ganado elogios 27 · vistas 3166

Supongo que te gusta

Origin blog.csdn.net/qq_45891413/article/details/105281022
Recomendado
Clasificación