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 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 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

 

 

// 一条直线上有 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 }
View Code

 

 

 

相关文章:

  • 2021-08-27
  • 2021-11-26
  • 2021-09-30
  • 2021-04-17
  • 2022-02-24
  • 2021-08-22
  • 2021-10-09
  • 2022-02-12
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-26
  • 2021-09-14
  • 2021-07-16
  • 2021-06-20
  • 2021-10-31
相关资源
相似解决方案