题意:n个数划分m组,所有组的和的平方相加最小
思路:
using namespace std;
LL sum[maxn], dp[maxn];
int num[maxn];
int n, m;
int main()
{
_;
int Test;
cin >> Test;
while (Test--) {
cin >> n >> m;
mem(dp, 0);
mem(sum, 0);
for (int i = 1; i<= n; ++i) {
cin >> num[i];
sum[i] = sum[i - 1] + num[i];
dp[i] = sum[i] * sum[i];
}
for (int i = 2; i <= m; ++i) {
for (int j = n - m + i; j >= i; --j) {//从dp[n-m+i]出開始更新。从后往前。要构成很多其它的划分,因此dp[n-m+i]后面的dp[]不用更新。更新了也用不到
for (int k = i - 1; k < j; ++k) { //由i-1, 划分i组 则前i-1 最多划分i-1组 正好
dp[j] = min(dp[j], dp[k] + (sum[j] - sum[k])*(sum[j] - sum[k]));
if(i == m && k == j - 1) goto lable;
}
}
}
lable:
cout << dp[n] << endl;
}
return 0;
}