日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZOJ3469 Food Delivery 区间DP

發布時間:2025/4/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZOJ3469 Food Delivery 区间DP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:有一家快餐店送外賣,現在同時有n個家庭打進電話訂購,送貨員得以V-1的速度一家一家的運送,但是每一個家庭都有一個不開心的值,每分鐘都會增加一倍,值達到一定程度,該家庭將不會再訂購外賣了,現在為了以后有更多的家庭訂購,要將外賣送到的情況下使得所有用戶的不開心值總和達到最小

思路:區間DP

dp[i][j][0] :表示i到j這段區間內的最小值且留在i點

dp[i][j][1]:表示i到j這段區間內的最小值且留在j點

那么轉移方程就是

sum[i]表示1到i的累加和,在枚舉i到j的時候(0,i)和(j,n)這兩段區間都要加倍

dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(sum[i]+sum[n]-sum[j])*(p[i+1].x-p[i].x));
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(sum[i]+sum[n]-sum[j])*(p[j].x-p[i].x));

dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(sum[i-1]+sum[n]-sum[j-1])*(p[j].x-p[i].x));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(sum[i-1]+sum[n]-sum[j-1])*(p[j].x-p[j-1].x));

1 //#pragma comment(linker, "/STACK:167772160")//手動擴棧~~~~hdu 用c++交 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <iostream> 6 #include <queue> 7 #include <stack> 8 #include <cmath> 9 #include <set> 10 #include <algorithm> 11 #include <vector> 12 #include <map> 13 // #include<malloc.h> 14 using namespace std; 15 #define clc(a,b) memset(a,b,sizeof(a)) 16 #define LL long long 17 const int inf = 0x3f3f3f3f; 18 const double eps = 1e-5; 19 // const double pi = acos(-1); 20 const LL MOD = 9901; 21 const int N = 1010; 22 23 // inline int r(){ 24 // int x=0,f=1;char ch=getchar(); 25 // while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();} 26 // while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 27 // return x*f; 28 // } 29 struct node{ 30 int x,y; 31 }p[N]; 32 33 34 bool cmp(node a,node b){ 35 return a.x<b.x; 36 } 37 38 int dp[N][N][2]; 39 int sum[N]; 40 41 int main(){ 42 int n,v,x; 43 while(~scanf("%d%d%d",&n,&v,&x)){ 44 for(int i=1;i<=n;i++){ 45 scanf("%d%d",&p[i].x,&p[i].y); 46 } 47 p[++n].x=x; 48 p[n].y=0; 49 sort(p+1,p+1+n,cmp); 50 51 sum[0]=0; 52 for(int i=1;i<=n;i++){ 53 sum[i]=sum[i-1]+p[i].y; 54 } 55 int tem; 56 for(int i=1;i<=n;i++){ 57 if(p[i].x==x){ 58 tem=i; 59 break; 60 } 61 } 62 63 for(int i=0;i<=n;i++){ 64 for(int j=0;j<=n;j++){ 65 dp[i][j][0]=dp[i][j][1]=inf; 66 } 67 } 68 dp[tem][tem][1]=dp[tem][tem][0]=0; 69 70 for(int i=tem;i>=1;i--){ 71 for(int j=tem;j<=n;j++){ 72 if(i==j) continue; 73 74 dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(sum[i]+sum[n]-sum[j])*(p[i+1].x-p[i].x)); 75 dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(sum[i]+sum[n]-sum[j])*(p[j].x-p[i].x)); 76 77 dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(sum[i-1]+sum[n]-sum[j-1])*(p[j].x-p[i].x)); 78 dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(sum[i-1]+sum[n]-sum[j-1])*(p[j].x-p[j-1].x)); 79 } 80 } 81 printf("%d\n",v*min(dp[1][n][0],dp[1][n][1])); 82 } 83 return 0; 84 }

?

轉載于:https://www.cnblogs.com/ITUPC/p/5502284.html

總結

以上是生活随笔為你收集整理的ZOJ3469 Food Delivery 区间DP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。