マウスのバッグ(CodeForces-148D)確率DP

ドラゴンと王女は大晦日に何をすべきかについて議論されています。ドラゴンは王女は、彼らはただ早く寝る必要があると考えながら、月明かりの下で踊る妖精を見るために山に飛んで示唆しています。彼らは友好的な合意に達するために必死なので、偶然にこのアップを残すことにしました。

彼らは、最初に含まバッグからマウスを描くターンを取る  wは  白と  B  黒色マウス。白いマウスの勝利を描画する最初である人。(王女は慎重に彼女のマウスを描画し、他のマウスを怖がらしない)各マウスの後の袋パニックにドラゴンによってマウスの残りの部分を描かれ、そのうちの一つは、バッグ自体の飛び出し。プリンセスは、最初に描画します。王女の勝利の確率は何ですか?

もうマウスはバッグや誰に存在しない場合は、竜の勝利を白いマウスを集めています。自身が描画されたと見なされていない袋から飛び出したマウスは、(勝者を定義していません)。マウスは袋を残していると、それはそれに返すことはありません。すべてのマウスは、他のすべてのものと同じ確率で袋から引き出され、そして全てのマウスは、他のすべてのものと同じ確率でバッグの飛び出し。

入力

入力データの唯一のラインは、二つの整数含ま  W  及び  B  (0≤  W、  B  ≤1000)。

出力

出力王女の勝利の確率。9 - 答えは絶対又は相対誤差が10を超えていない場合に正しいと考えられています。

入力

1 3

出力

0.500000000

入力

5 5

出力

0.658730159

注意

のは、最初のサンプル見ていきましょう。彼女の最初のターンで白いマウスを描画し、すぐに勝つ王女の確率は1/4です。黒のマウスを描画し、彼の最初のターンに勝つない竜の確率は3/4 * 2/3 = 1/2です。この後袋に残った2匹のマウスが存在する - オン白黒一つは、そのうちの一つが飛び出し、およびその他のは、彼女の第二のターンの王女によって描かれています。姫マウスが白の場合、彼女はそう誰もがそうルールに竜の勝利よると、白いマウスを取得していない、(確率は1/2 * 1/2 = 1/4)で勝利します。

 

質問の意味:ドラゴンキングと夜の王女は、その違いがあったやるべき。そこで、彼らは袋からグラブにマウスを何をすべきかを決定するために行くことにしました。そこワットラットのみ袋、Bのみクマネズミがあり、ラットを捕まえた者が勝つようになるだろう、と誰も勝利がケースの上に逮捕されなかった場合、それはドラゴンキングウォンです。プリンセス最初にキャッチし、各ドラゴンキャッチ後のマウスは、1匹の他のマウスがあるだろう、尽きるランダムであるラットを使い果たしました。あなたは姫を獲得する確率が何であるかを尋ねます。

アイデア:我々セットDP [i] [j]は王女は、唯一残っているマウスiとjのみクマネズミをケースに勝つ表します。明らかに黒いマウスDPは存在しない[I] [0] = 1ではなく、マウスDP [0] [I] = 0

プリンセス勝利のキャッチラット確率一度:I /(I + J)

プリンセスブラックマウス、ドラゴンブラックラット(黒マウス> = 2の数が提供される)、ラットは確率走っ:jは/(I + J) *(J-1)/(I + J-1)I /(I + J = 2)DP [J-2] [1-I]
提供= 3)プリンセスブラックマウス、ラットドラゴンブラックは、ブラックラットを実行>ブラックマウスの数確率:J /(I + J) (J-1)/( I + J-1)(J -2)/(I + J-2)* DP [I]、[J-3]

ACコード:

#include <bits/stdc++.h>
typedef long long ll;
const int maxx=1010;
const int inf=0x3f3f3f3f;
using namespace std;
double dp[maxx][maxx];
int w,b;
void init()
{
    memset(dp,0,sizeof(dp));
    for(int i=1; i<=w; i++)
    {
        dp[i][0]=1;
    }
    for(int i=1; i<=b; i++)
    {
        dp[0][i]=0;
    }
}
int main()
{
    while(cin>>w>>b)
    {

        init();
        for(int i=1; i<=w; i++)
        {
            for(int j=1; j<=b; j++)
            {
                dp[i][j]+=(double)i/(i+j);
                if(j>=2)
                    dp[i][j]+=((double)j/(i+j)*(double)(j-1)/(i+j-1)*(double)i/(i+j-2)*dp[i-1][j-2]);
                if(j>=3)
                    dp[i][j]+=((double)j/(i+j)*(double)(j-1)/(i+j-1)*(double)(j-2)/(i+j-2)*dp[i][j-3]);
            }
        }
        cout<<fixed<<setprecision(9)<<dp[w][b]<<endl;
    }
    return 0;
}

 

公開された204元の記事 ウォン称賛16 ビュー20000 +

おすすめ

転載: blog.csdn.net/weixin_43846139/article/details/104027980