分析:设 dp[i][j]为在前 j 件物品中选择 i 对物品时最小的疲劳度
为使疲劳最小,要拿排序后相邻的两数。从小到大依次递推
(1)当j == 2*i时
dp[i][j]=dp[i-2][j-1]+(p[i]-p[i-1])*(p[i]-p[i-1])
(2)当j > 2*i时
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 5 using namespace std; 6 7 int list[2001]; 8 int dp[1001][2001]; 9 10 int main() 11 { 12 int n,k; 13 while(cin >> n >> k) 14 { 15 for(int i = 1; i <= n; ++i) 16 cin >> list[i]; 17 18 sort(list + 1, list + 1 + n); 19 20 for(int i = 0; i <= n; ++i) 21 dp[0][i] = 0; 22 23 for(int i = 1; i <= k; ++i) 24 for(int j = 2 * i; j <= n; ++j) 25 if(j == 2 * i) 26 dp[i][j] = dp[i-1][j-2] + (list[j]-list[j-1]) * (list[j]-list[j-1]); 27 else 28 dp[i][j] = min(dp[i][j-1], dp[i-1][j-2] + (list[j]-list[j-1]) * (list[j]-list[j-1])); 29 30 cout << dp[k][n] << endl; 31 } 32 33 return 0; 34 }