Food Delivery ZOJ - 3469 (区间dp)
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Food Delivery ZOJ - 3469 (区间dp)相关的知识,希望对你有一定的参考价值。
Food Delivery
题意:快递员送外卖,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 }
以上是关于Food Delivery ZOJ - 3469 (区间dp)的主要内容,如果未能解决你的问题,请参考以下文章
Food Delivery ZOJ - 3469 (区间dp)