zoukankan      html  css  js  c++  java
  • HDU1227:Fast Food

    题目链接:Fast Food

    题意:一条直线上有n个饭店,问建造k个原料厂(仍旧在商店位置)得到的最小距离

    分析:见代码

    //一条直线上有n个饭店,问建造k个原料厂(仍旧在商店位置)得到的最小距离
    //首先预处理从i到j的最小距离,可以知道选的点必为(i+j)/2,所以用dis[i][j]记录距离
    //dp[i][j]表示前j个建造了i个原料厂的最小距离, 
    //状态转移:dp[i][j]从min(dp[i-1][m])(i-1<=m<=j-1)转移过来,因为
    //需要建厂的位置可选在i~j,故有此转移方程,需要将dp[i][j]初始化为inf,并且先处理dp[1][i]=dis[1][i] 
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int cas,n,k,loc[220],dis[220][220],dp[31][201];
    
    int main()
    {
        while(scanf("%d %d",&n,&k),n&&k)
        {
            for(int i=1;i<=n;++i) scanf("%d",loc+i);
            //若在i到j之间建原料站,则产生的距离dis[i][j] 
            for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
            {
                dis[i][j]=0;
                for(int p=i;p<=j;++p) dis[i][j]+=abs(loc[p]-loc[(i+j)>>1]);
            }
            for(int i=1;i<=n;++i) dp[1][i]=dis[1][i];
            for(int i=2;i<=k;++i)for(int j=i;j<=n;++j)
            {
                dp[i][j]=0x3f3f3f3f;
                for(int m=i-1;m<j;++m) 
                dp[i][j]=min(dp[i][j],dp[i-1][m]+dis[m+1][j]);
            }
            printf("Chain %d
    Total distance sum = %d
    
    ",++cas,dp[k][n]);
        }
    } 
    View Code
  • 相关阅读:
    安装kafka
    linux安装jdk
    rabbitmq
    企业级docker镜像仓库----Harbor高可用部署
    kubernetes基础概念理解
    kubeadm安装kubernetes集群v1.14.3
    salt-stack深入学习
    salt-stack的数据系统Pillars
    salt-stack的数据系统Grains
    salt-stack
  • 原文地址:https://www.cnblogs.com/chendl111/p/5831756.html
Copyright © 2011-2022 走看看