題目簡述:
乙個r行c列的格仔,起始點在(1,1),終點在(r,c),每一步可能的走法有:不動、向右走、向下走,每走一步花費兩點魔法值,現給出在每一點三種走法的概率,求走完迷宮時所花魔法值的期望。
分析:運用dp演算法的話,首先需要確定乙個合適狀態來描述子問題的情況,很明顯本題的狀態可以定義為dp[i][j],代表從(i,j)到(r,c)所花費魔法值。然後我們需要考慮這樣的狀態之間能否正確的轉化,利用數學期望的定義以及其線性,不難寫出如下轉移方程:
dp[i][j] = p[i][j][1]*dp[i][j] + p[i][j][2]*dp[i][j+1] + p[i][j][3]*dp[i+1][j] + 2
,然後再合併同類項可得:
dp[i][j] = (p[i][j][2]*dp[i][j+1] + p[i][j][3]*dp[i+1][j] + 2)/(1-p[i][j][1])。
最後,需要確定邊界,很明顯,dp[r][c]=0,因為當在點(r,c)時,他不需要花費魔法值就可以到達(r,c),這樣我們就可以從後往前遞推了。
附上**:
#include using namespace std;
const int maxn=1005+10;
double p[maxn][maxn][3],dp[maxn][maxn];
int main()
printf("%.3lf\n",dp[1][1]);
}return 0;
}
題意簡述:
有0-n個格仔,初始點在0,終點是》=n,每走一步之前都要丟一次六個面的色子,標上1-6,扔到幾就走幾步,當然色子是等概率出現數字的,還有就是中間某一點可能和其它的一點聯通,比如a和b聯通,當我處於a時,就可以直接飛到b,最後問走到終點時所扔色子次數的期望。
分析:顯然,首先從後往前推,最後乙個肯定是0,然後,如果有格仔與這次的第i格相連,就可以開始跳躍,不然,就加上dp[1——6]*1.0/6.0,最後再加上1即可,再輸出dp[0]即可輕鬆ac掉。
所以,附上**:
#include using namespace std;
const int maxn=100000+19;
double dp[maxn];
int a[maxn];
int main()
for(int i=n-1;i>=0;i--)
dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])/6+1;
} printf("%.4lf\n",dp[0]);
} return 0;
}
概率dp入門
概率dp主要用於求解期望 概率等題目。轉移方程有時候比較靈活。一般求概率是正推,求期望是逆推。通過題目可以體會到這點。poj2096 collecting bugs include include include include include typedef long long ll using ...
骰子 概率dp
因為會有人被彈出佇列,所以我設定的期望dp為 於是有當只剩乙個人的時候,那個人必勝,再往下,先看它在隊首的情況,其他的情況呢,也就是不在隊首的時候呢,於是,連立這兩個方程組,可以得到 所以,就可以利用乙個pow來處理double型來解決這個問題了。include include include in...
禮物(概率dp)
夏川的生日就要到了。作為夏川形式上的男朋友,季堂打算給夏川買一些生 日禮物。商店裡一共有種禮物。夏川每得到一種禮物,就會獲得相應喜悅值wi 每種禮物的喜悅值不能重複獲得 每次,店員會按照一定的概率pi 或者不拿出禮物 將第i種禮物拿出來。季堂每次都會將店員拿出來的禮物買下來。沒有拿出來視為什麼都沒有...