HDU 1421寝室を移動します

HDU 1421搬送されたベッドルーム(DP)

トピックリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1421
ここに画像を挿入説明
問題解決のアイデア:
あなたがかかった場合は、各項目について、取ると取らないための2つのアプローチが、ありますが、それはしなければなりませんDP [I]:プラス疲労値は、取らない、それは(完全に初期化)、フロントかなり良い結果に等しく、二次元DPで処理し、iがjはアイテムの数、状態遷移方程式を表し、アイテムの数を表し、Jは =分(DP [I-1] J、DP [I-2] [J-1] +(NUM [I] - NUM [I - 1])*(NUM [I] - NUM [I - 1]) (場合には、その後疲労値プラス生成された2つの物品を得るために、物品2の当量数を減らすためにとら))。
コードは以下の通りであります:

#include <bits/stdc++.h>

#define inf 0x3f3f3f
#define MAXN 2005
int dp[MAXN][MAXN], num[MAXN];

inline int min(int a, int b) {//取小
    return a > b ? b : a;
}

int main() {
    int n, k;
    while (scanf("%d %d", &n, &k) != EOF) {
        memset(dp, inf, sizeof(dp));
        dp[0][0] = 0;//i为0是第一次dp跑的位置,不能忘记清0
        for (int i = 1; i <= n; i++) {
            scanf("%d", &num[i]);
            dp[i][0] = 0;
        }
        std::sort(num + 1, num + n + 1);//排序保证相邻最小
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i / 2; j++) {
                dp[i][j] = min(dp[i - 1][j], dp[i - 2][j - 1] + (num[i] - num[i - 1]) * (num[i] - num[i - 1]));//取两种方案的最小值
            }
        }
        printf("%d\n", dp[n][k]);
    }
    return 0;
}
公開された35元の記事 ウォンの賞賛3 ビュー879

おすすめ

転載: blog.csdn.net/weixin_43823753/article/details/104716930