[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
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 xi,ci(−109≤xi,ci≤109) , 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
Sample Input
Sample Output
正确解法:
有几个线性排列的空教室,现在准备把几个教室建造成糖果屋
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 }