HDU 5001 Walk 概率dp,矩陣快速冪

2021-10-16 17:11:36 字數 3652 閱讀 9887

題意:給定乙個n點,m條邊的有向圖,在這n個點中隨機選取乙個起點,然後從這個點開始走d步,每一步以相同的概率到達與當前點相鄰的點。問,d步後,不經過每個點的概率

思路1:設dp[i][j]表示走i步後到達點j的概率。

要求不經過點x的概率,那麼每一步中到達點x的情況是不合法的,我們可以在處理每一步時 將到達點x的情況都去掉,即將dp[i][x]置0。那麼d步走完後,到達其餘點的路徑中都不會包含點x,即最終到達其餘點的概率和就是不經過點x的概率

#include

#include

#include

#include

#include

#include

using namespace std;

#define ll long long

//#define int long long

#define ull unsigned long long

#define pii pair

#define mid ((l + r)>>1)

#define chl (root<<1)

#define chr (root<<1|1)

#define lowbit(x) ( x&(-x) )

const

int manx =

1e4+10;

const

int manx2 =

4e7+10;

const

int inf =

2e9;

const

int mod =

1e4+7;

int t,n,m,d,s,e;

vector<

int>vt[60]

;double dp[manx][60

];double

solve

(int x)

} dp[d]

[x]=0;

for(

int i=

1;i<=n;i++

)ans+

=dp[d]

[i];

return ans;

}int

main()

for(

int i=

1;i<=n;i++

)printf

("%.10f\n"

,solve

(i));}

return0;

}

#include

#include

#include

#include

#include

#include

using namespace std;

#define ll long long

//#define int long long

#define ull unsigned long long

#define pii pair

#define mid ((l + r)>>1)

#define chl (root<<1)

#define chr (root<<1|1)

#define lowbit(x) ( x&(-x) )

const

int manx =

1e4+10;

const

int manx2 =

4e7+10;

const

int inf =

2e9;

const

int mod =

1e4+7;

int t,n,m,d,s,e;

vector<

int>vt[60]

;double mp[60]

[60];

struct mat

friend mat operator*

(const mat &x,

const mat &y)

}init,base;

mat q_pow

(mat a,

int b)

return ans;

}double

solve

(int x)

intmain()

for(

int i=

1;i<=n;i++

) init.a[1]

[i]=

1.0/n;

for(

int j=

1;j<=n;j++

)for

(int i=

1;i<=n;i++

)for

(int i=

1;i<=n;i++

)printf

("%.10f\n"

,solve

(i));}

return0;

}

思路2:算出會經過點x的概率,最後用1減

我們將d步中某一步在點x的狀態用1表示,不在點x的狀態用0表示,那麼我們可以分別求出以下幾類路徑的概率(x表示任意狀態,容易知道這幾類路徑包含了會經過點x的所有情況),然後計算總和:

1***x……***(第一步經過點x)

01***……***(第一步不經過點x,第二步經過點x)

001xx……***(第

一、二步不經過點x,第三步經過點x)

……//轉移方式和思路1相同,只是計算方式不同

#include

#include

#include

#include

#include

#include

using namespace std;

#define ll long long

//#define int long long

#define ull unsigned long long

#define pii pair

#define mid ((l + r)>>1)

#define chl (root<<1)

#define chr (root<<1|1)

#define lowbit(x) ( x&(-x) )

const

int manx =

1e4+10;

const

int manx2 =

4e7+10;

const

int inf =

2e9;

const

int mod =

1e4+7;

int t,n,m,d,s,e;

vector<

int>vt[60]

;double dp[manx][60

];double

solve

(int x)

}return ans+

=dp[d]

[x];

}int

main()

for(

int i=

1;i<=n;i++

)printf

("%.10f\n",1

-solve

(i));}

return0;

}

例:poj-3744-scout yyf i(概率dp+矩陣快速冪)

hdu4035 樹上概率dp

從葉子到根,帶入公式求引數 kuangbin hdu 4035 dp求期望的題。題意 有n個房間,由n 1條隧道連通起來,實際上就形成了一棵樹,從結點1出發,開始走,在每個結點i都有3種可能 1.被殺死,回到結點1處 概率為ki 2.找到出口,走出迷宮 概率為ei 3.和該點相連有m條邊,隨機走一條...

hdu 3853 概率dp入門

題意 在一塊r c的棋盤上,從位置 1,1 的地方走到位置為 r,c 的地方,每走一步的代價為2,在位置 i,j 可能會走到位置 i 1,j i,j 1 以及 i,j 題目中給出每個點走向下乙個方向的概率,求花的總代價。分析 一道很基礎的概率dp,dp i j 表示的是從位置 i,j 走到 r,c ...

hdu4336(壯壓DP 概率DP)

需要集齊n張卡片,每買一包零食,裡面可能有不同的卡片,存在每種卡片的概率已知,每包零食最多有一張卡片。問集齊n張的期望。dp i 表示i這個狀態下還需要多少包的期望,dp 1 一開始不會寫,看了別的狀態轉移方程 dp i sum dp i 1 如果想得到一張卡片,期望就是 1 va k 上面的方程和...