D.マウスのバッグ(確率dp)

トピックポータル

質問:ポケットにwwがありますw白いマウス、bbb黒いマウス、あなたとあなたの対戦相手は交代でマウスを捕まえ、白いマウスを捕まえた人が最初に勝ちます。次の制約があります。

  1. お先にどうぞ
  2. 対戦相手がネズミを捕まえると、どんな色を捕まえても、ランダムにネズミから逃げますが、捕まえたときは逃げません。
  3. 誰も白いマウスを捕まえず、ポケットにマウスがない場合、対戦相手が勝ちます。
  4. w、b∈[0、1000] w、b∈[0,1000] w b[ 0 1 0 0 0 ]

あなたが勝つことができる確率はどれくらいですか?

アイデア:私たちが使うF [i]の[j]をF [i]の[J]f [ i ] [ j ]は、マウスを捕まえる番になったときに白いマウスを捕まえる確率を表します。次に、最初にf [i] [j] = ii + jf [i] [j] = \ cfrac {i} {i + j}f [ i ] [ j ]=+j、そしてこれがヒットをキャッチする方法なので、今回キャッチできなかった場合は、相手がキャッチしないことを期待するだけで、勝つことが期待できます。したがって、今回はキャッチできず、対戦相手がキャッチできない確率は、k = ji + j ∗ j − 1 i + j − 1 k = \ cfrac {j} {i + j} * \ cfrac {です。 j-1} {i + j-1}k=+jJ+j1j1、そして、対戦相手が捕まえた後、対戦相手が白いマウスから逃げているのか、黒いマウスから逃げているのかを検討します。

  • 白の場合、j> = 2 j> = 2であることを確認する必要がありますj>>=2.このとき、白いマウスを捕まえる確率はk ∗ f [i − 1] [j − 2] ∗ ii + j − 2 k * f [i-1] [j-2] * \ cfrac {i} {i + j-2}kf [ i1 ] [ j2 ]+j2
  • 黒の場合、j> = 3 j> = 3であることを確認する必要がありますj>>=3.このとき、白いマウスを捕まえる確率はk ∗ f [i] [j − 3] ∗ j − 2 i + j − 2 k * f [i] [j-3] * \ cfrac { j-2} {i + j-2}kf [ i ] [ j3 ]+j2j2

最後に、これら2つの結果をf [i] [j] f [i] [j]に追加しますf [ i ] [ j ]で十分です。

コード:

#include<bits/stdc++.h>
#define endl '\n'
#define null NULL
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
//#define int long long
#define pii pair<int,int>
#define ull unsigned long long
#define pdd pair<double,double>
#define lowbit(x) x&-x
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read()
{
    
    
    int x=0,f=1;
    char ch=gc();
    while(ch<'0'||ch>'9')
    {
    
    
        if(ch=='-')
            f=-1;
        ch=gc();
    }
    while(ch>='0'&&ch<='9')
    {
    
    
        x=x*10+ch-'0';
        ch=gc();
    }
    return x*f;
}
using namespace std;
const int N=1e3+55;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-6;
const double PI=acos(-1);

double f[N][N];

void solve()
{
    
    
    int w,b;
    cin>>w>>b;
    for(int i=1; i<=w; i++)
        f[i][0]=1;
    for(int i=1; i<=b; i++)
        f[0][i]=0;
    for(int i=1; i<=w; i++)
    {
    
    
        for(int j=1; j<=b; j++)
        {
    
    
            f[i][j]=i*1.0/(i+j);
            double k=(1-f[i][j])*((j-1)*1.0/(i+j-1)),sum=0;
            if(j>=2)
                sum+=k*f[i-1][j-2]*i*1.0/(i+j-2);
            if(j>=3)
                sum+=k*f[i][j-3]*(j-2)*1.0/(i+j-2);
            f[i][j]+=sum;
        }
    }
    printf("%.9f\n",f[w][b]);
}

signed main()
{
    
    
    //int T;cin>>T;
    //while(T--)
    solve();


    return 0;
}

おすすめ

転載: blog.csdn.net/Joker_He/article/details/109898449