BZOJ2306 幸福路徑(動態規劃,倍增)

2021-08-20 09:19:31 字數 2828 閱讀 9478

bzoj

不要求確切的值,只需要逼近

顯然可以通過移動

∞ ∞

步來達到逼近的效果

考慮每次的一步怎麼移動 設f

[i][

j]f [i

][j]

表示走i i

步到了j' role="presentation">j

j能夠得到的最大權值 f[

i][v

]=ma

x(f[

i−1]

[u])

+w[v

]∗pi

,(u,

v)∈g

f [i

][v]

=max

(f[i

−1][

u])+

w[v]

∗pi,

(u,v

)∈

g這樣的複雜度是o(

t(n+

m)) o(t

(n+m

))

,t t

是自己設定的步數

但是這樣子逼近精度很慢 假設p

=0.999999

' role="presentation">p

=0.999999p=

0.999999

,大概要107107

步才能達到目標進度

這樣子顯然太慢

我們考慮如何優化

既然一步步走很慢,那麼我們考慮倍增來走

首先預處理以下兩個點之間的連通性 設g

[i][

j][k

] g[i

][j]

[k

]表示走了2k

2

k步後是否能從

i i

到j' role="presentation">j

j那麼,f[

i][j

] f[i

][j]

表示走了2i

2

i步到達

j j

能夠拿到的最大權值

這樣子每次隨意列舉兩個點i,

j' role="presentation">i,j

i,j來轉移,發現有些東西沒法記錄

比如列舉兩個點,但是不能保證這兩個點之間的最優路徑是拼接在一起的

所以我們加一維f[

i][j

][l]

f [i

][j]

[l

]表示從

i i

到j' role="presentation">jj走了

2l2

l步拿到的最優權值

列舉乙個中間點

k k

f[i][j]

[l]=

max(

f[i]

[k][

l−1]

+p2l

−1f[

k][j

][l−

1])' role="presentation">f[i

][j]

[l]=

max(

f[i]

[k][

l−1]

+p2l

−1f[

k][j

][l−

1])f

[i][

j][l

]=ma

x(f[

i][k

][l−

1]+p

2l−1

f[k]

[j][

l−1]

)這樣子的複雜度就是o(

n3lo

g107)

o (n

3log

107

)了 其實g

g

也可以不用預處理是否聯通,直接把不連通的距離設為−i

nf' role="presentation">−in

f−in

f就行了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define rg register

#define max 111

inline

int read()

struct linee[max<<4];

int h[max],cnt=1;

inline

void add(int u,int v);h[u]=cnt++;}

int n,m,s;

double f[30][max][max];

double w[max],p,ans;

int main()

for(int l=1;l<30;++l,p*=p)

for(int k=1;k<=n;++k)

for(int i=1;i<=n;++i)

for(int j=1;j<=n;++j)

f[l][i][j]=max(f[l][i][j],f[l-1][i][k]+p*f[l-1][k][j]);

for(int i=1;i<=n;++i)ans=max(ans,f[29][s][i]);

printf("%.1lf\n",ans+w[s]);

return

0;}

bzoj 2306 Ctsc2011 幸福路徑

有向圖 g有n個頂點 1,2,n,點i 的權值為 w i 現在有乙隻螞蟻,從 給定的起點 v0出發,沿著圖 g 的邊爬行。開始時,它的體力為 1。每爬過一條邊,它的體力都 p,而螞蟻爬到某個頂點時的幸福度,是它當時的體力與該點權值的乘積。求最大幸福值。因為當體力很小後,對答案就沒什麼影響力,所以用乙...

bzoj2306 Ctsc2011 幸福路徑

有向圖 g有n個頂點 1,2,n,點i 的權值為 w i 現在有乙隻螞蟻,從給定的起點 v0出發,沿著圖 g 的邊爬行。開始時,它的體力為 1。每爬過一條邊,它的體力都會下降為原來的 倍,其中 是乙個給定的小於1的正常數。而螞蟻爬到某個頂點時的幸福度,是它當時的體力與該點權值的乘積。我們把螞蟻在爬行...

bzoj 2500 幸福的道路 動態規劃 單調棧

題意 給出一棵樹,每條邊都有乙個長度。我們規定每個點的權值為從該點開始走過的一條最長的路徑的長度。求乙個最長的區間 l,r 使得 l,r 裡面點權的最大值和最小值只差不超過m。n 1000000 一開始看錯題目了,結果卡了半天。最後發現是一道大水題。先求點權,直接dp求,經典模型啊。隨便寫。後面求出...