[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\n",min(f[n][1],f[n][0]));
51     }
52 
53 
54     return 0;
55 }
View Code

 

posted @ 2019-05-23 16:13  kaike  阅读(183)  评论(0编辑  收藏  举报