[DP]BuildingShops转载

原创
小哥 3年前 (2022-10-18) 阅读数 89 #大杂烩

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 c i . 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 ( 1 ≤ n ≤ 3000 ) , denoting the number of the classrooms.
In the following n lines, each line contains two integers x i , c i ( − 10 9 ≤ x i , c i ≤ 10 9 ) , 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 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 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

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除