码迷,mamicode.com
首页 > 其他好文 > 详细

递推DP URAL 1167 Bicolored Horses

时间:2015-05-09 16:23:41      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

 

题目传送门

 1 /*
 2     题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy指数是多少
 3     状态转移方程:dp[i][l] = min (dp[i][l], dp[i-1][j] + cur * (l - j - cur)) 表示第l匹马要不还在i马棚,或者去新的马棚
 4     本题关键在dp初始化INF,由于黑马白马的表示简单,求指数方便
 5 */
 6 #include <cstdio>
 7 #include <iostream>
 8 #include <algorithm>
 9 #include <cstring>
10 #include <cmath>
11 using namespace std;
12 
13 const int MAXN = 5e2 + 10;
14 const int INF = 0x3f3f3f3f;
15 int dp[MAXN][MAXN];
16 int a[MAXN], sum[MAXN];
17 
18 int main(void)        //URAL 1167 Bicolored Horses
19 {
20     //freopen ("L.in", "r", stdin);
21 
22     int n, k;
23     while (scanf ("%d%d", &n, &k) == 2)
24     {
25         memset (sum, 0, sizeof (sum));
26         for (int i=0; i<=k; ++i)
27             for (int j=0; j<=n; ++j)    dp[i][j] = INF;    
28         for (int i=1; i<=n; ++i)    {scanf ("%d", &a[i]);    sum[i] = a[i];    sum[i] += sum[i-1];}
29 
30         dp[0][0] = 0;
31         for (int i=1; i<=k; ++i)
32         {
33             for (int j=0; j<=n; ++j)
34             {
35                 for (int l=j+1; l<=n; ++l)
36                 {
37                     int cur = sum[l] - sum[j];
38                     dp[i][l] = min (dp[i][l], dp[i-1][j] + cur * (l - j - cur));
39                 }
40             }
41         }
42 
43         printf ("%d\n", dp[k][n]);
44     }
45 
46     return 0;
47 }

 

递推DP URAL 1167 Bicolored Horses

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4490515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!