石頭剪刀布(概率DP)

2022-04-14 05:11:10 字數 1263 閱讀 2666

上來題意就理解錯了,題意並不是你可以通過前面的對手來判斷接下來的對手,而是讓你通過前面對手的操作來決策。

定義$g[i][j][k]$表示對手出了$i$個石頭,$j$個剪刀,$k$個布的概率。

$f[i][j][k][q]$表示對手出了$i$個石頭,$j$個剪刀,$k$個布,下乙個將出$q$的概率。

(注:下面及**中用$1$表示石頭,$2$表示布,$3$表示剪刀)

轉移為$g[j][k][q]+=g[j-1][k][q]*p[i][1]+g[j][k-1][q]*p[i][2]+g[j][k][q-1]*p[i][3]$

$f[j][k][q][u]+=g[j][k][q]*p[i][u]+f[j-1][k][q][u]*p[i][1]+f[j][k-1][q][u]*p[i][2]+f[j][k][q-1][u]*p[i][3]$

統計答案為:$ans=\sum\limits \frac^*(n-i-j-k)}$

#include#include#includeusing namespace std;

#define ll long long

#define r register

inline ll read()

while(cc>='0'&&cc<='9')

return aa*bb;

}const int n=55;

int n;

ll com[n][n];

double ans,p[n][4],f[n][n][n][4];//石頭,布,剪刀

int main()

f[0][0][0][0]=1.0;

for(r int i=1;i<=n;++i)

for(r int j=i;j>=0;--j)

for(r int k=i-j;k>=0;--k)

for(r int q=i-j-k;q>=0;--q)

for(r int u=((j+k+q)==i?0:3);u>=0;--u)

com[1][0]=com[1][1]=1;

for(r int i=2;i<=n+2;++i)

for(r int i=0;ians+=max(f[i][j][k][1]+f[i][j][k][3]*3,max(f[i][j][k][2]+f[i][j][k][1]*3,f[i][j][k][3]+f[i][j][k][2]*3))/(1.0*com[n][i+j+k]*(n-i-j-k));

printf("%.12lf\n",ans);

return 0;

}

DP 石頭剪刀布

小明和小頭遇到了矛盾,他們決定用男人的方式解決戰鬥 石頭剪刀布。但是小菜覺得石頭剪刀布已經過時了,於是他發明了另乙個更男人的遊戲。小菜給出乙個自然數n,小明和小頭輪流操作,每次操作可以把n減去n所擁有的數字中的最大值或者最小值 不包括0 不能操作者輸 即當n 0時 小菜怕他們不懂,於是給了乙個例子n...

剪刀石頭布

開始學習時寫的剪刀石頭布 雖然是用c 寫的 我感覺思想還是面向過程 慚愧慚愧 include include include include includeusing namespace std enum caiquan class inte cet inte cet inte cet system...

石頭剪刀布

題目描述 石頭剪刀布是常見的猜拳遊戲 石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一樣,則不分勝負。在 生活大 第二季第 8 集中出現了一種石頭剪刀布的公升級版遊戲。公升級版遊戲在傳統的石頭剪刀布遊戲的基礎上,增加了兩個新手勢 斯波克 星際迷航 主角之一。蜥蜴人 星際迷航 中的反面角色。這五種手勢...