Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 14107 Accepted
Submission(s): 4751
dp[i][j] = Min ( dp[i-2][j-1] + (a[i]-a[i-1]) * (a[i]-a[i-1]) , dp[i-1][j] ) ;
dp[i][j]代表在前 i 个物品中取 j 对搬运的最小疲劳值。
思路我就不写了,因为我的思路不甚清晰,所以就贴上别人的链接,有兴趣的可以看看高人写的:
HDU 1421 搬寝室 hdu1421n中选k个不相邻数的最小值 hdu 1421 搬寝室
我想说的是要注意两点,一开始我用的自己写的冒泡排序,后来提交超时,看网上的代码大都直接调用了库函数(像qsort、sort函数),我改用sort函数之后不再超时,说明好的排序算法在做题中还是很有用处的!之后出现WA的现象,调试发现这是dp数组初始化不对造成的,因为要比较大小,需要取较小值,所以应该初始化为一个极大值(例如9999999),而且dp[i][0]这一溜的数需要初始化为0。
下面是代码:
1 #include <iostream>
2 #include <algorithm>
3 #include <string.h>
4 using namespace std;
5 int dp[2001][1001];
6 int Min(int a,int b)
7 {
8 //if(a==0)
9 // return b;
10 //if(b==0)
11 // return a;
12 return a<b?a:b;
13 }
14 int main()
15 {
16 int n,k;
17 while(cin>>n>>k){
18 int a[2001];
19 for(int i=1;i<=n;i++)
20 cin>>a[i];
21 //排序
22 /* 冒泡排序超时
23 for(int i=1;i<=n-1;i++)
24 for(int j=1;j<=n-i;j++)
25 if(a[j]>a[j+1]){
26 int t;
27 t=a[j];a[j]=a[j+1];a[j+1]=t;
28 }
29 */
30 sort(a+1,a+1+n);
31
32 //初始化
33 memset(dp,9999999,sizeof(dp));
34 for(int i=0;i<=n;i++)
35 dp[i][0] = 0;
36
37 //实现dp数组
38 for(int i=2;i<=n;i++)
39 for(int j=1;j<=i/2;j++){
40 dp[i][j] = Min(dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]),dp[i-1][j]);
41 }
42 cout<<dp[n][k]<<endl;
43 }
44
45 return 0;
46 }
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
10011975 | 2014-01-22 20:13:55 | Accepted | 1421 | 750MS | 8228K | 750 B | G++ | freecode |
Freecode : www.cnblogs.com/yym2013
原文:http://www.cnblogs.com/yym2013/p/3530301.html