RQN 273 马棚问题 dp

PID273 / 马棚问题 

2016-07-29 18:21:55

运行耗时:1624 ms

运行内存:16248 KB

题目描述

每天,小明和他的马外出,然后他们一边跑一边玩耍。当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚。他把他的马排成一排然后跟随它走向马棚, 因为他们非常疲劳,小明不想让他的马做过多的移动。因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序 号。而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面。已知共有黑、白两种马,而且它们相处得并不十分融洽。如果有i个白马和j个黑马在 一个马棚中,那么这个马棚的不愉快系数将是i*j。所有k个马棚不愉快系数的和就是系数总和。确定一种方法把n匹马放入k个马棚,使得系数总和最小。

输入格式

输入:在第一行有两个数字:n(1≤n≤500)和k(1≤k≤n)。在接下来的n行是n个数。在这些行中的第i行代表队列中的第i匹马的颜色:1意味着马是黑色的,0意味着马是白色的。

输出格式

输出:只输出一个单一的数字,代表系数总和可能达到的最小值。

样例输入 6 3 {6匹马,3个马棚}
1 {第1匹马为黑马}
1
0 {第3匹马为白马}
1
0
1

样例输出 2 {最小系数总和}

思路:dp[i][t]=min(dp[i][t],dp[j][t-1]+(h[i]-h[j])*(b[i]-b[j]));

      dp[i][t]表示第i匹马放入第t个马棚的最小答案;

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll __int64
#define esp 0.00000000001
const int N=1e3+10,M=1e6+10,inf=1e9+10,mod=1000000007;
int a[N];
int h[N];
int b[N];
int dp[N][N];
int main()
{
    int x,y,z,i,t;
    while(~scanf("%d%d",&x,&y))
    {
        for(i=0; i<=x; i++)
            for(t=0; t<=y; t++)
            dp[i][t]=inf;
        dp[0][0]=0;
        for(i=1;i<=x;i++)
        {
            scanf("%d",&a[i]);
            h[i]=h[i-1];
            b[i]=b[i-1];
            if(a[i])
                h[i]++;
            else
                b[i]++;
        }
        for(t=1;t<=y;t++)
        {
            for(i=t;i<=x;i++)
                for(int j=t-1;j<i;j++)
                dp[i][t]=min(dp[i][t],dp[j][t-1]+(h[i]-h[j])*(b[i]-b[j]));
        }
        printf("%d\n",dp[x][y]);
    }
    return 0;
}
时间: 2024-08-23 08:14:34

RQN 273 马棚问题 dp的相关文章

codeforces gym 100357 H (DP 高精度)

题目大意 有r*s张扑克牌,数字从1到 r,每种数字有s种颜色. 询问对于所有随机的d张牌,能选出c张组成顺子的概率和组成同花的概率. 解题分析 对于组成顺子的概率,令dp[i][j][k]表示一共选出了i张牌,数字从1~j,最后有k张牌是顺子.对于每个数字进行考虑,有0~s种选法.要保证连续c张牌的顺子. 对于组成同花的概率,令dp[i][j]表示一共选出了i张牌,颜色从1~j,.对于每种颜色进行考虑,有0~r种选法.要保证没有c张牌是相同颜色的. 最后用高精度来输出答案. 参考程序 1 #i

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

codevs 1962 马棚问题--序列型DP

1962 马棚问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他的马做过多的移动.因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号.而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面.已知共有黑

DP——马棚问题

Description 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随他走向马棚.因为他们非常疲倦,小明不想让他的马做过多的移动.因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号.而且他不想让他的K个马棚中任何一个空着,也不想让任何一匹马在外面.已知有黑白两种马,而且它们相处的很不融洽.如果有i个白马和j个黑马在一个马棚中,那么这个马棚的不愉快系数是i*j.所有k

Codeforces Round #273 (Div. 2) D. Red-Green Towers DP

链接: http://codeforces.com/problemset/problem/478/D 题意: 给出r个红砖,g个绿砖,问有多少种方法搭成最高的塔. 题解: 举红色球的层数,当第i层为红色是,i层上面有[0,r]个 红色的,可推出dp[i+j]=dp[i+j]+dp[j],最后 再统计红色的个数就行了,红色最少为max(h*(h+1)/2-g,0). 代码: 31 int dp[MAXN]; 32 33 int main() { 34 ios::sync_with_stdio(fa

hdu 5155(DP)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5155 Harry And Magic Box Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 273    Accepted Submission(s): 137 Problem Description One day, Harry got

HDU5816 Hearthstone(状压DP)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an online collectible card game from Blizzard Entertainment. Strategies and luck are the most important factors in this game. When you suffer a desperate situation an

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除

hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!

http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE,  更重要的是找出规律后,O(n)递推也过不了,TLE,一定要矩阵快速幂.然后立马GG. 用2代表m,1代表f.设dp[i][j][k]表示,在第i位,上一位站了的人是j,这一位站的人是k,的合法情况. 递推过去就是,如果j是1,k是2,那么这一位就只能放一个2,这个时猴dp[i][k][2] += dp[i - 1][j][k]; 其他情况分类下就好,然后