即:
n(a-b)^2+(c-d)^2< (a-c)^2+(b-d)^2
dp[i][j]表示 i 个物品取 j 对的最小疲劳数。
状态转移方程: dp[i][j]=min{ dp[i-1][j], dp[i-2][j-1]+(w[i]-w[i-1])^2 }
View Code
1 #include <iostream>
2 #include <algorithm>
3 #include <cstdio>
4 using namespace std;
5 int w[ 2010],dp[ 2010][ 2010];
6 int main()
7 {
8 int n,k,i,j;
9 while(cin>>n>>k)
10 {
11 for(i= 0;i<n;i++)
12 cin>>w[i];
13 sort(w,w+n);
14 for(i= 0;i<=n;i++)
15 for(j= 0;j<=k;j++)
16 dp[i][j]= 0xfffffff;
17 for(i= 0;i<=n;i++)
18 dp[i][ 0]= 0;
19 for(i= 2;i<=n;i++)
20 for(j= 1;j<=i&&j<=k;j++)
21 {
22 int t=dp[i- 2][j- 1]+(w[i- 1]-w[i- 2])*(w[i- 1]-w[i- 2]); // 数组w 从下标 0 开始
23 if(dp[i- 1][j]<t)
24 dp[i][j]=dp[i- 1][j];
25 else dp[i][j]=t;
26 }
27 cout<<dp[n][k]<<endl;
28 }
29 return 0;
30 }
2 #include <algorithm>
3 #include <cstdio>
4 using namespace std;
5 int w[ 2010],dp[ 2010][ 2010];
6 int main()
7 {
8 int n,k,i,j;
9 while(cin>>n>>k)
10 {
11 for(i= 0;i<n;i++)
12 cin>>w[i];
13 sort(w,w+n);
14 for(i= 0;i<=n;i++)
15 for(j= 0;j<=k;j++)
16 dp[i][j]= 0xfffffff;
17 for(i= 0;i<=n;i++)
18 dp[i][ 0]= 0;
19 for(i= 2;i<=n;i++)
20 for(j= 1;j<=i&&j<=k;j++)
21 {
22 int t=dp[i- 2][j- 1]+(w[i- 1]-w[i- 2])*(w[i- 1]-w[i- 2]); // 数组w 从下标 0 开始
23 if(dp[i- 1][j]<t)
24 dp[i][j]=dp[i- 1][j];
25 else dp[i][j]=t;
26 }
27 cout<<dp[n][k]<<endl;
28 }
29 return 0;
30 }