1. 程式人生 > >Food Delivery ZOJ - 3469 (區間dp)

Food Delivery ZOJ - 3469 (區間dp)

位置 turn pro pan return isp ive != truct

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

Food Delivery ZOJ - 3469 (區間dp)