題意:給定乙個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 上面的方程和...