POJ-1322 Chocolate 动态规划
生活随笔
收集整理的這篇文章主要介紹了
POJ-1322 Chocolate 动态规划
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這題當M=N=0的時候要輸出1.000? 剛寫的時候默認從第二次開始取了.
詳見代碼:
#include <cstdlib> #include <cstring> #include <cstdio> #include <algorithm> #include <iostream> using namespace std;/* 題意:從一個擁有無限多的盒子中拿出不同顏色的糖果,拿出任何一種顏色的概率都是1/C每次拿出來的糖果都放在桌子上,如果有相同顏色的糖果,就把這兩顆糖果吃掉.問拿了N次后,桌子上面剩余的糖果數(shù)量為M的概率是多大 解法:設(shè)狀態(tài)dp[i][j]為選i次后剩余j顆糖果的概率為多大,省略了一維糖果的顏色數(shù),因此每次需要重新計算這個dp值,有如下dp方程:dp[i][j] = dp[i-1][j-1] * (C-j+1)/C + dp[i-1][j+1] * (j+1)/C含義就是從上一次后拿到了一顆不同顏色的糖果,桌子上增加了一顆糖果而來或者是拿到了一顆相同顏色的糖果,桌子上減少了一顆糖果而來 通過牛人的測試,當N大于1000的時候,為偶數(shù)就當做1000處理,為奇數(shù)的時候就當做1001處理,因為N很大之后,僅僅靠小數(shù)點的后三位已經(jīng)反映不去其差別 */int C, M, N; double dp[2][1005][105]; void DP() {memset(dp, 0, sizeof (dp)); dp[1][1][1] = 1.0; // 摸一次一定會得到一個顏色的糖果for (int i = 2; i <= N; ++i) {int x = i & 1;for (int j = 0; j <= C; ++j) {if (j - 1 >= 0)dp[x][i][j] += dp[!x][i-1][j-1]*(C-j+1)/C;if (j + 1 <= C)dp[x][i][j] += dp[!x][i-1][j+1]*(j+1)/C;}} } int main() {while (scanf("%d", &C), C) {scanf("%d %d", &N, &M); if (N == 0 && M == 0) { printf("%.3lf\n", 1.);continue;}if ((N&1)^(M&1) || M > C || M > N) {printf("%.3lf\n", 0.);continue;}if (N > 1000) {N = N & 1 ? 1001 : 1000;}DP();printf("%.3lf\n", dp[N&1][N][M]);}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/Lyush/archive/2013/01/11/2857203.html
總結(jié)
以上是生活随笔為你收集整理的POJ-1322 Chocolate 动态规划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员成长的三个方法
- 下一篇: ArcEngine对Blob字段赋值的方