在一條路上有n個地雷,有個sb人按照心情走在這條路上,往前走1步的概率是p,往前走2步的概率是(1-p),求他活著走過這條路的概率。
很容易想到一種dp方程:f[i]=p*f[i-1]+(1-p)*f[i-2];
然而一看範圍:[1, 100000000]
怎麼可能不超時呢……
然後可以這麼想:只要避開了最後乙個地雷不就安全了嗎?我們把路分成n段,分別是1~地雷1位置,地雷1位置+1~地雷2位置,地雷2位置+1~地雷3位置,每次的目標是避開每段最後那個地雷。
然後我們可以用矩陣快速冪來加速,因為顯然: =∗
然後初始值f[1]=1,f[2]=p;所以進行當前這一段長度-1的矩陣乘法後,處在左上角的那個數就是踩到地雷的概率了。
不過這個概率是建立在f[1]=1的基礎上的,而對於不是第一段的段,最初的f值不一定是1,不過也沒關係,顯然那個值就是避開了前一段地雷,活著來到這一段的值啦。所以每次矩陣快速冪後進行ans=ans*(1-mat[0][0]);的操作即可!
如果有不懂的地方看看**可能就懂了呢。
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int n;double p;
int a[12];
struct jz;
jz mul(jz x,jz y)
return re;
}jz pow(jz aa,int n)
aa=mul(aa,aa);
n>>=1;
}return ans;
}int main()
printf("%.7f\n",ans);
}return
0;}
poj 3744 概率dp 矩陣快速冪
poj 3744 題目大概是 小明要走一段路 有p的概率走一步 1 p 的概率走兩步 然後上面有雷 問安全通過的概率 題目通過雷把路程分為多段 把每段安全通過的概率相乘 就是整段安全通過的概率 設dp i 是小明安全到i的概率 到i的方式有兩種 一種是從 i 1 走一步 第二種是從 i 2 走兩步 ...
poj 3744 矩陣優化的概率DP
題意 你在一條布滿地雷的道路上,開始在座標1。每次有概率p向前走一步,有概率1 p向前走兩步。道中路某幾個點上會有地雷,問你安全通過的概率。地雷數n 10,座標範圍在100000000內。假設dp i 表示安全走到i點的概率,那麼dp i p dp i 1 1 p dp i 2 很簡單的乙個轉移,可...
POJ3744題解 概率dp,矩陣快速冪
士兵從起點1出發,每次移動有p的概率走一步,有1 p的概率走兩步,已知有n個格仔有地雷,問士兵不踩地雷的概率。第一道真正意義上的概率dp題目,一開始打算令dp i 意為更新到i點時踩雷的概率,dp i p dp i 1 1 p dp i 2 這樣寫看上去也是對的 第一眼看上去的角度上來說 但是其實並...