シンプルダイナミックE-移動ベッドルーム(冬季訓練)のプログラミング

要求の対象と
寝室を移動するためには非常に疲れて、XHD深い。時間は、一日が床をシールする第10号として、ビル27、ビル3から移動することを余儀なくさXHD。寝室を見て2006年7月9日にトレースここで、nのアイテム、彼はただ移動することを決めたので、以下2000以上の整数nはので、ボーッと起動XHD、それは、あまりにも多くある2 XHD 2があるため、ライン上の過去のk個を、まだ非常に疲れて小さなkのではないですnは、疲労が、各転送が二つのXHD物事を動かすの長年の経験に基づいて(追加ここでは、その記事の右手の重量差の二乗に比例することが判明している幸いにもたびに、XHDよりも整数大きいです左側のもの)。第3条の例えば左手XHD重量、物品6、それらの(6-3)^ 2 = 9今移動の彼の疲労度乏しいXHDの重量の右手この動きは、これらの2が知りたいのですがどのようなk個のアイテムの後に(つまり、最低の疲労である)最良の状態を、彼を教えてください。
入力
、各グループ内の入力データを二行、最初の行がある二つの数字のn、kはあります(2 <2 =
K <= N <2000)。2行目有するnはそれぞれ(重量で2 ^ 15より小さい整数陽性である)重量の整数N項目を表す。
出力は、
各入力に対応します データ、出力データは、各行、彼の疲労のみ最小値を表す。
サンプル入力
2. 1
。1. 3
出力例
4
疲労最小、最大値に割り当てられた最初の配列値DPのプロセス全体を通して必要は、アレイ状に配置されています各値は、隣接する記事を取るためです。DP [i] [j]は得られた最小疲労記事、動的遷移方程式を選択フロント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]));

#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;
}
公開された38元の記事 ウォン称賛27 ビュー3166

おすすめ

転載: blog.csdn.net/qq_45891413/article/details/105281022