Food Delivery ZOJ - 3469 (区间dp)

Food Delivery

 ZOJ - 3469 

题意:快递员送外卖,n个客户,起始位置为x,速度为v,每个客户单位时间不满意度增加hi,问最少增加多少不满意度。

每一个客户可能是从左侧送到或者从右侧送到。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define CLR(m,a) memset(m,a,sizeof(m))
 4 const int maxn=1010;
 5 const int inf=0x3f3f3f3f;
 6 int dp[maxn][maxn][2];
 7 int sum[maxn];
 8 struct Node{
 9     int x,h;
10     bool operator <(const Node &a)const {
11         return x<a.x;
12     }
13 }node[maxn];
14 
15 int main(){
16     int n,v,x;
17     while(scanf("%d%d%d",&n,&v,&x)!=EOF){
18         CLR(dp,inf);
19         CLR(sum,0);
20         node[0].x=x;
21         node[0].h=0;
22         for(int i=1;i<=n;i++){
23             scanf("%d%d",&node[i].x,&node[i].h);
24         }
25         sort(node,node+n+1);
26         sum[0]=node[0].h;
27         for(int i=1;i<=n;i++) sum[i]=sum[i-1]+node[i].h;
28         int k;
29         for(int i=0;i<=n;i++){
30             if(node[i].x==x){
31                 dp[i][i][0]=dp[i][i][1]=0;
32                 k=i;
33                 break;
34             }
35         }
36         for(int i=k;i>=0;i--){
37             for(int j=k;j<=n;j++){
38                 if(i==j) continue;
39                 dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(sum[n]-(sum[j]-sum[i]))*(node[i+1].x-node[i].x));
40                 dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(sum[n]-(sum[j]-sum[i]))*(node[j].x-node[i].x));
41                 dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(sum[n]-(sum[j-1]-sum[i-1]))*(node[j].x-node[i].x));
42                 dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(sum[n]-(sum[j-1]-sum[i-1]))*(node[j].x-node[j-1].x));
43             }
44         }
45         printf("%d\n",min(dp[0][n][0],dp[0][n][1])*v);
46     }
47 }
View Code

 

posted @ 2017-08-26 12:46  yijiull  阅读(229)  评论(0编辑  收藏  举报