蒟蒻的题解

071maozihan 2022-04-03 13:01:57 2022-04-08 19:06:43 41 返回题目

#include <bits/stdc++.h>

#define int long long

const long long maxn = 3e2 + 10;

using namespace std;

int n, m;

int a[maxn], dp[maxn][maxn], cnt[maxn];  //dp数组dp[i][j]表示 选择i个数时,最后的数字为a[j]时的最小花费

signed main() {

    cin >> n >> m;

    for (int i = 1; i <= n; i++) {

        cin >> a[i];

    }

    for (int i = 0; i <= m; i++) {

        for (int j = 0; j <= n; j++) {

            dp[i][j] = INT_MAX;//初始化

        }

    }

    for (int i = 1; i <= n; i++) dp[1][i] = 0;//无论怎样,选择一个数的花费为0

    for (int i = 2; i <= m; i++) {      //枚举选择数字的个数

        for (int j = 1; j <= n; j++) {  //枚举最后一个数

            for (int k = i - 1; k < j; k++) {//枚举倒数第二个数

                dp[i][j] = min(dp[i][j], dp[i - 1][k] + abs(a[k] - a[j]));

            }

        }


    }
    //考虑到之前枚举的第n个数可以不选,需要重新枚举,寻找最大值
    int ans = INT_MAX;

    for (int i = 1; i <= n; i++) {

        ans = min(ans, dp[m][i]);

    }

    cout << ans;

    return 0;
}
{{ vote && vote.total.up }}