注意table初始化的值,尽量大,不过不能用INT_MAX,会溢出;不能用系统自带pow,会TLE
#include<iostream>
#include<climits>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
int input[2001], table[2001][1001];
void dp(int n,int k)
{
sort(input, input + n + 1);
for (int i = 0; i <= n; i++)
for (int j = 0; j <= k; j++)
table[i][j] = 99999999;
for (int i = 0; i <= n; i++)
table[i][0] = 0;
for (int i = 2; i <= n; i++)
for (int j = 1; j <= k; j++)
table[i][j] = min(table[i - 1][j], table[i - 2][j - 1] + (input[i]-input[i-1])*(input[i]-input[i-1]));
}
int main()
{
int n, k;
while (scanf("%d",&n)!=-1)
{
cin >> k;
for (int i = 1; i <= n; i++)
scanf("%d",&input[i]);
dp(n,k);
printf("%d\n", table[n][k]);
}
return 0;
}