描述
题解
早两天我就已经补完题了,但是一直无法上传图片,所以就一直没有写题解,谁知道今天才发现,由于我是从照片上截的图,导致图片过大而且 优快云 系统问题,给我提示了系统维护的信息,误导了我。于是将图片发给另一个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;
}