[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

 

转载于:https://www.cnblogs.com/Kaike/p/10912551.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你一些指导来创建和使用shops数据库。 首先,你需要安装一个关系型数据库管理系统(RDBMS),例如MySQL、PostgreSQL或Microsoft SQL Server。这些RDBMS都提供了创建和管理数据库的工具。 一旦你安装了RDBMS,你可以使用SQL(结构化查询语言)来创建数据表和插入数据。下面是一个示例的SQL代码来创建一个名为“shops”的数据库: ``` CREATE DATABASE shops; ``` 接下来,你可以创建一个名为“products”的表来存储商品信息,例如商品名称、价格和库存量。下面是一个示例的SQL代码: ``` CREATE TABLE products ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL, PRIMARY KEY (id) ); ``` 这将创建一个名为“products”的表,其中包含四个列:id、name、price和stock。id列是自动增量的主键,确保每个商品都有一个唯一的标识符。name列存储商品名称,price列存储商品价格,stock列存储商品库存量。 一旦你创建了“products”表,你可以使用INSERT语句向表中插入数据。例如,下面是一个示例的SQL代码来插入一些商品信息: ``` INSERT INTO products (name, price, stock) VALUES ('T-shirt', 19.99, 100), ('Jeans', 49.99, 50), ('Sneakers', 79.99, 25); ``` 这将向“products”表中插入三个商品,分别是T-shirt、Jeans和Sneakers,每个商品都有一个价格和库存量。 一旦你向表中插入了数据,你可以使用SELECT语句来查询数据。例如,下面是一个示例的SQL代码来查询所有商品的名称和价格: ``` SELECT name, price FROM products; ``` 这将返回一个结果集,其中包含所有商品的名称和价格。 当然,这只是一个简单的示例,你可以根据自己的需求创建更复杂的表和查询。希望这些指导可以帮助你创建和使用shops数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值