zoukankan      html  css  js  c++  java
  • codevs 1962 马棚问题--序列型DP

    1962 马棚问题

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
    题目描述 Description

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

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input

    6 3

    1

    1

    0

    1

    0

    1

    样例输出 Sample Output

    2

    /*典型的序列性DP,f[i][j]记录前i匹马,分到j个马棚里的最小不愉快系数,p[i][j]储存着i到j这个区间的马在一个马棚里的不愉快系数,house[i]储存着到地i匹马总共有多少匹白马,多少匹黑马*/
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    using namespace std;
    #define N 501
    int f[N][N],p[N][N];
    struct House{
        int a;int b;
    };
    House house[N];
    int n,k;
    void input()
    {
        scanf("%d%d",&n,&k);
        int x;
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&x);
            house[i].a=house[i-1].a;
            house[i].b=house[i-1].b;
            if(x==0) house[i].a++;
            if(x==1) house[i].b++;
        }
        for(int i=1;i<=n-1;++i)/*对于p数组的预处理特别重要*/
          for(int j=i+1;j<=n;++j)
          {
              int r1=abs(house[i-1].a-house[j].a);
              int r2=abs(house[i-1].b-house[j].b);
              p[i][j]=r1*r2;
          }
        memset(f,99,sizeof(f));
        for(int i=1;i<=n;++i)
        f[i][1]=p[1][i];/*DP方程的边界,前i个马在一个马棚的不愉快系数*/
    }
    void dp()
    {
        for(int j=2;j<=k;++j)
          for(int i=j;i<=n;++i)
            for(int t=j-1;t<=i-1;++t)
            f[i][j]=min(f[i][j],f[t][j-1]+p[t+1][i]);/*DP方程前i匹马,分到j个马棚里的最小不愉快系数,就是把j-1<=t<=i-1匹马放到j-1个马棚中,其余t+1到i匹马在一个马棚中的不愉快系数最小值*/
    }
    int main()
    {
        input();
        dp();
        cout<<f[n][k]<<endl;
        return 0;
    }
    View Code
     
  • 相关阅读:
    Android 开发工具类 19_NetworkStateReceiver
    Android 开发工具类 18_NetWorkUtil
    Sticky Footer (让页脚永远停靠在页面底部,而不是根据绝对位置)
    min-height最小高度的实现(兼容IE6、IE7、FF)(解决IE6不兼容min-height)
    不同浏览器设置背景透明度
    讨论内外边距对行内元素是否起作用,则要对行内替换元素和行内非替换元素分别讨论:
    超链接访问过后hover样式就不出现的问题
    解决:子元素设置margin-top,父元素也受影响的问题
    制作0.5px像素的细条
    去掉inline-block元素间隙的几种方法
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5304301.html
Copyright © 2011-2022 走看看