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求,經典模型啊。隨便寫。後面求出...