ZJOI2006 物流運輸

2022-05-05 18:48:09 字數 1754 閱讀 2982

題目傳送門

看題目描述中,碼頭的個數小的可憐,竟然只有20,一開始想會不會又是網路流或者狀壓dp啥的。(好像狀壓dp真能做qaq)

不過讀完題之後,發現這應該是一道求最短路的題,而且還不只是最短路,既然又可以改道又要求最小花費,那麼肯定還有dp.

最短路+dp的結合題。我們可以這麼考慮,反正這題資料範圍賊小,我們不如先預處理出來第i天到第j天全部能跑的一條最短路的長度是多少(如果不存在就是inf),之後呢,我們用dp[i]來表示到第i天的最小花費。那麼就可以得知,dp[i] = min(dp[i],dp[j] + cost[j+1][i] + k);列舉從1到i-1的j 就可以了。

為什麼可以這麼做呢?我們考慮,如果有一條路,在第n天可以走,而在第n+1天不能走,那麼此時我們就必須要改道。而改道我們直接在dp的時候考慮就好,那我們只要去求每種情況下不改道的話花費就可以。之後在dp列舉的時候,總會列舉到所有的改道和不改道的情況的。注意cost如果不是inf,要乘以其能走的天數。

這樣可以保證考慮到所有情況。時間複雜度n^2*m^2,可以過。

看一下**。

#include#include

#include

#include

#include

#include

#include

#define rep(i,a,n) for(int i = a;i <= n;i++)

#define per(i,n,a) for(int i = n;i >= a;i--)

#define enter putchar('\n')

using

namespace

std;

typedef

long

long

ll;typedef pair

pr;const

int inf =2e9;

const

int m = 2005

;int

read()

while(ch >= '

0' && ch <= '9'

)

return ans *op;

}struct

node

e[m<<1

];set

q;set

:: iterator it;

int ecnt,head[m],n,m,k,ei,d,p,a,b,cost[105][105],dp[105],dis[25

],x,y,z;

bool pd[30][105],bro[30

];void add(int x,int y,int

z)int dij(int

s) }

}return

dis[m];

}int

main()

rep(i,

1,n)

}rep(i,

1,n)

rep(j,i,n)

if(cost[i][j] < inf) cost[i][j] *= (j-i+1

); rep(i,

1,n) dp[i] = cost[1

][i];

rep(i,

2,n)

rep(j,

1,i-1) dp[i] = min(dp[i],dp[j] + cost[j+1][i] +k);

printf(

"%d\n

",dp[n]);

return0;

}

ZJOI2006 物流運輸

description 物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能...

ZJOI2006 物流運輸

dp套最短路。還是蒟蒻做題少。開始想的是狀壓dp。但是因為太蒻了,不會很高效地處理一些點集的最短路,弄了乙個t飛的演算法。之後看了題解才知道原來是可以用dp套最短路做的。為什麼需要dp?因為本題涉及到狀態的選擇。每一天要麼不更換線路,要麼更換。顯然這個東西是沒有辦法貪心搞的,所以只能用dp把狀態整合...

ZJOI2006 物流運輸

物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...