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 }

 

 

posted @ 2012-04-07 08:32  笑巧  阅读(868)  评论(0编辑  收藏  举报