USACO 1.3 Barn Repair(DP)

这是贪心专题吗,这个题用DP搞的(实在是没看出怎么贪心),数据里,不是按顺序给出的,而且有m>c的情况,我被坑啦。。。DP状态转移还是很好想的。

 1 /*
 2  ID: cuizhe
 3  LANG: C++
 4  TASK: barn1
 5 */
 6 #include <iostream>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <cstdlib>
10 #include <map>
11 #include <algorithm>
12 using namespace std;
13 #define N 100000000
14 int dp[51][201],sum[201],o[201],p[201];
15 int main()
16 {
17     int n,m,s,i,j,c,k;
18     freopen("barn1.in","r",stdin);
19     freopen("barn1.out","w",stdout);
20     scanf("%d%d%d",&m,&s,&c);
21     for(i = 1;i <= c;i ++)
22     {
23         scanf("%d",&n);
24         p[i] = n;
25         o[n] = 1;
26     }
27     if(m > c)
28     {
29         printf("%d\n",c);
30         return 0;
31     }
32     sort(p+1,p+c+1);
33     for(i = 1;i <= s;i ++)
34     {
35         if(o[n])
36         sum[i] = sum[i-1]+1;
37         else
38         sum[i] = sum[i-1];
39     }
40     for(i = 1;i <= c;i ++)
41     {
42         dp[1][i] = p[i]-p[1]+1;
43     }
44     for(i = 2;i <= m;i ++)
45     {
46         for(j = 1;j <= c;j ++)
47         {
48             dp[i][j] = N;
49             for(k = 1;k <= j-1;k ++)
50             {
51                 if(j-k > 0)
52                 {
53                     if(dp[i][j] > dp[i-1][k]+sum[p[j]]-sum[p[k+1]]+1)
54                     dp[i][j] = dp[i-1][k]+sum[p[j]]-sum[p[k+1]]+1;
55                 }
56             }
57         }
58     }
59     printf("%d\n",dp[m][c]);
60     return 0;
61 }
posted @ 2012-10-23 19:41  Naix_x  阅读(146)  评论(0编辑  收藏  举报