HDU1421(动态规划)
解题思路:先排序,之后相邻的肯定是疲劳度最小的。
即:
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 }