题目大意:给出N个数,要求你将N个数分成K个集合,使每个集合的(最大值 - 最小值)^ 2和达到最小
解题思路:先排个序,从小打大排
设dp[i][j]为前i个数分成j个集合最小平方和
得到转移方程dp[i][j] = dp[k][j - 1] + (val[i] - val[k + 1]) ^ 2
val[i]为第i个数的值
设l > k,且点l比点k优
则dp[k][j - 1] + (val[i] - val[k + 1]) ^ 2 >= dp[l][j - 1] + (val[i] - val[l + 1]) ^ 2
化简得val[i] >= (dp[l][j - 1] + val[l+ 1] ^ 2 - dp[k][j - 1] - val[k + 1] ^ 2 ) / (2 * val[l + 1] - 2 * val[k + 1])
因为val随着i的增大而增大,所以得到斜率方程
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;