Building Shops
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 379 Accepted Submission(s): 144
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(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
For each test case, print a single line containing an integer, denoting the minimal cost.
Sample Input
Sample Output
5
11
// 一条直线上有 n 的教室,想要在这些点上建一些糖果店,建设糖果店的成本分为 2 部分,建设费,右边的非糖果店到这个糖果店的距离差的和(累加到是一个糖果店为止)
//典型DP题
dp[i] 为在 i 建造最后一个糖果店的最小花费的话
丛左到右 dp[i] = min(dp[i],dp[j]+shop[i].v-(n-i+1)*(shop[i].p-shop[j].p)) (1<=j<i) p是位置,v为建造费
还有就是需要排序,还有需要 long long 型
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 using namespace std; 5 #define LL long long 6 #define MX 3005 7 struct Shop 8 { 9 LL p,v; 10 bool operator < (const Shop& b)const 11 { 12 return p<b.p; 13 } 14 }shop[MX]; 15 LL dp[MX]; 16 17 int main() 18 { 19 int n; 20 while (scanf("%d",&n)!=EOF) 21 { 22 for (int i=1;i<=n;i++) 23 scanf("%I64d%I64d",&shop[i].p,&shop[i].v); 24 sort(shop+1,shop+1+n); 25 LL total = 0; 26 for (int i=1;i<=n;i++) 27 total += shop[i].p - shop[1].p; 28 29 dp[1]=shop[1].v+total; 30 for (int i=2;i<=n;i++) 31 { 32 for (int j=1;j<i;j++) 33 { 34 if (j==1) dp[i] = dp[j] + shop[i].v - (n-i+1)*(shop[i].p-shop[j].p); 35 else dp[i] = min(dp[i],dp[j]+shop[i].v-(n-i+1)*(shop[i].p-shop[j].p)); 36 } 37 } 38 LL ans = dp[1]; 39 for (int i=2;i<=n;i++) 40 ans = min(dp[i],ans); 41 printf("%I64d\n",ans); 42 } 43 return 0; 44 }