Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8907 Accepted Submission(s): 2996
1 #include <iostream> 2 #include <iomanip> 3 #include <fstream> 4 #include <sstream> 5 #include <algorithm> 6 #include <string> 7 #include <set> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 #include <cstdio> 14 #include <cstdlib> 15 #include <cstring> 16 #include <cmath> 17 #include <ctime> 18 #include <ctype.h> 19 using namespace std; 20 21 #define min(a,b) a<b?a:b 22 23 int n,k; 24 int weight[2000]; 25 int dp[2010][1005]; //dp[i][j]表示在取第i件物品前,已经有j对物品被选中 26 27 int fun(int a,int b) 28 { 29 return (weight[a]-weight[b])*(weight[a]-weight[b]); 30 } 31 32 int main() 33 { 34 int i,j; 35 while(~scanf("%d%d",&n,&k)) 36 { 37 for(i=1;i<=n;i++) 38 scanf("%d",&weight[i]); 39 sort(weight,weight+n+1); 40 memset(dp,0,sizeof(dp)); 41 for(i=1;i<=n;i++) 42 for(j=1;j<=n/2;j++) 43 dp[i][j]=INT_MAX; 44 for(i=2;i<=n;i++) 45 for(j=1;j<=i/2;j++) 46 dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+fun(i-1,i)); 47 printf("%d\n",dp[n][k]); 48 } 49 return 0; 50 }