zoukankan      html  css  js  c++  java
  • ural 1167. Bicolored Horses 夜

    ans[i][j]表示 第i个马厩放到第j只马时的最小不高兴值

    blacksum[i]表示到第i只马时的黑马数

    详解见代码注释

    http://acm.timus.ru/problem.aspx?space=1&num=1167

    #include<iostream>
    #include<string>
    #include<string.h>
    #include<queue>
    #include<math.h>
    #include<algorithm>
    #include<vector>
    #include<stdio.h>
    #define Max 0x7ffffff

    using namespace std;

    int ans[501][501];
    int blacksum[501];
    int dp(int i,int j)//第i个马厩放到第j只马时的最小不高兴值
    {
        if(ans[i][j]!=-1)//已查过 避免重复
        return ans[i][j];
        if(i==1)//只有一个马厩时
        {
            ans[i][j]=blacksum[j]*(j-blacksum[j]);//讲黑马数与白马数相乘
            return ans[i][j];
        }
        if(i==j)//马厩与马数量一样 
        {
            ans[i][j]=0;//这时只能放一只马 所以值为0
            return ans[i][j];
        }
        if(i<j)//关键情况为马的数量多于马厩数量
        {
            ans[i][j]=Max;//先让其值等于最大
            for(int l=1;l<=j-i+1;l++)//最多可放j-i+1只马 最少一只
            {
                int bn=blacksum[j]-blacksum[j-l];//放l只马时的黑马数量
                ans[i][j]=min(ans[i][j],dp(i-1,j-l)+(bn*(l-bn)));//在l变化中取最小

            }
            return ans[i][j];
        }
    }
    int main()
    {
        int n,k,i;
        cin>>n>>k;
        memset(blacksum,0,sizeof(blacksum));
        for(i=1;i<=n;i++)
        {
            cin>>blacksum[i];
            blacksum[i]+=blacksum[i-1];//到第i只马时的黑马数
        }
        memset(ans,-1,sizeof(ans));//初始化为-1
        cout<<dp(k,n);
        return 0;
    }

  • 相关阅读:
    TCP/IP四层模型
    Java编程题
    大整数阶乘的运算(可以计算1000!) .
    sleep和wait的区别
    Javascript保留字(Javascript Reserved Words)
    WEBLOGIC 内存溢出 解决方案
    Java学习的30个目标以及系统架构师推荐的书
    笔记分析
    MySQL分区(Partition)功能试验
    Java线程:生产者消费者模型
  • 原文地址:https://www.cnblogs.com/liulangye/p/2272343.html
Copyright © 2011-2022 走看看