題目傳送門
看題目描述中,碼頭的個數小的可憐,竟然只有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天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...