zoukankan      html  css  js  c++  java
  • [DP]Building Shops

    Building Shops

    Problem Description

    HDU’s n classrooms are on a line ,which can be considered as a number line. Each classroom has a coordinate. Now Little Q wants to build several candy shops in these n classrooms.

    The total cost consists of two parts. Building a candy shop at classroom i would have some cost ci . For every classroom P without any candy shop, then the distance between P and the rightmost classroom with a candy shop on P 's left side would be included in the cost too. Obviously, if there is a classroom without any candy shop, there must be a candy shop on its left side.

    Now Little Q wants to know how to build the candy shops with the minimal cost. Please write a program to help him.

    Input

    The input contains several test cases, no more than 10 test cases.
    In each test case, the first line contains an integer n(1n3000) , denoting the number of the classrooms.
    In the following n lines, each line contains two integers xi,ci(109xi,ci109) , denoting the coordinate of the i -th classroom and the cost of building a candy shop in it.
    There are no two classrooms having same coordinate.

    Output

    For each test case, print a single line containing an integer, denoting the minimal cost.

    Sample Input

    3
    1 2
    2 3
    3 4
    4
    1 7
    3 1
    5 10
    6 1

    Sample Output

    5
    11

    正确解法:

    有几个线性排列的空教室,现在准备把几个教室建造成糖果屋

    1.每个教室建造糖果屋的成本为ci

    2.空教室的成本是 与左边最近糖果屋的距离

    我们用DP来做,f[i][1]表示第i个建造糖果屋,前i个的成本

    f[i][0]表示第 i 个不建造糖果屋,前i个的成本。

    很容易得出 f[i][1]=min(f[i-1][1],f[i-1][0])+ci;

    f[i][0]=min(f[j][1]+  (j+1,j+2  ……,i 到j的距离))

    ll t=0;
    for(int j=i-1;j>=1;j--)
    {
        t+=(i-j)*(a[j+1].x-a[j].x);
        f[i][0]=min(f[i][0],f[j][1]+t);
    }

    最后,它的xi和ci 是(1,10^9) 开了 ll

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <set>
     7 #include <map>
     8 #include <queue>
     9 #include <vector>
    10 #include <cctype>
    11 #include <sstream>
    12 using namespace std;
    13 typedef long long ll;
    14 const int inf=0x7fffffff;
    15 const int N=3000+100;
    16 const int M=50000+10;
    17 const int MOD=1e9+7;
    18 const double PI=acos(-1.0);
    19 int n;
    20 ll f[N][3];
    21 ll MM=999999999999;
    22 struct node
    23 {
    24     ll x,c;
    25 }a[N];
    26 bool cmp(node a,node b)
    27 {
    28     return (a.x<b.x);
    29 }
    30 int main()
    31 {
    32     while(scanf("%d",&n)!=EOF)
    33     {
    34         //f[0][1]=f[0][0]=0;
    35         for(int i=1;i<=n;i++)
    36             f[i][1]=f[i][0]=MM;
    37         for(int i=1;i<=n;i++)
    38             scanf("%lld %lld",&a[i].x,&a[i].c);
    39         sort(a+1,a+n+1,cmp);
    40         for(int i=1;i<=n;i++)
    41         {
    42             f[i][1]=min(f[i-1][0],f[i-1][1])+a[i].c;
    43             ll t=0;
    44             for(int j=i-1;j>=1;j--)
    45             {
    46                 t+=(i-j)*(a[j+1].x-a[j].x);
    47                 f[i][0]=min(f[i][0],f[j][1]+t);
    48             }
    49         }
    50         printf("%lld
    ",min(f[n][1],f[n][0]));
    51     }
    52 
    53 
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    为什么一看编程技术文章就这么兴奋呢?
    今天弄会了如何使用VB6使用AutoCAD提供的dll操作AutoCAD了
    简单工厂模式没想像中的难啊
    Linq本质论,C#3.0的特性。写的太好了!收藏!
    struct和class的区别
    饿了
    解决Eclipse 3.3+lomboz无法启动的问题
    IE8通过Acid2了
    Linux档案/目录 权限及修改
    Linux 初识man、info
  • 原文地址:https://www.cnblogs.com/Kaike/p/10912551.html
Copyright © 2011-2022 走看看