ACM模版

描述

题解

早两天我就已经补完题了,但是一直无法上传图片,所以就一直没有写题解,谁知道今天才发现,由于我是从照片上截的图,导致图片过大而且 CSDN 系统问题,给我提示了系统维护的信息,误导了我。于是将图片发给另一个QQ号又重新发给自己,压缩了一下,总算是可以了。

以上全是废话……

这个问题是一个区间 dp 的问题,我们需要先对序列进行排序,然后规划就好了,dp[i][j] 表示从 i 到 j 的最小花费。

代码

#include <iostream>
#include <algorithm>

using namespace std;

const int MAXN = 105;

int A[MAXN];
int dp[MAXN][MAXN];

int main()
{
    int n, c, k;
    while (cin >> n >> k >> c)
    {
        memset(dp, 0x3f, sizeof(dp));

        for (int i = 0; i < n; i++)
        {
            cin >> A[i];
        }
        sort(A, A + n);

        for (int i = n - k; i >= 0; i--)
        {
            for (int j = i + k - 1; j < n; j++)
            {
                dp[i][j] = c + (A[j] - A[i]) * (A[j] - A[i]);
                for (int k = i; k < j; k++)
                {
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
                }
            }
        }

        cout << dp[0][n - 1] << endl;
    }

    return 0;
}