例題 10 12 紙牌遊戲 UVa 1637

2021-07-25 23:39:01 字數 1824 閱讀 5712

題意:36張牌分成9堆,沒堆4張,每次可以拿走某兩堆頂部的牌,但需要的點數相同,如果有多種拿法就等概率隨機拿,問拿完所有牌的概率。

分析:直接用9元組表示當前狀態,即每堆剩餘的牌數,狀態數為5^9=1953125。設d[i]表示狀態i對應的概率,則根據全概率公式,d[i]為後繼狀態的成功概率的平均值,按照動態規劃的寫法計算即可。

**如下:

//

//created by bluebuff 2016/1/11

//#pragma comment(linker,"/stack:102400000,102400000")

//#include

//#include

//#include

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include //isstringstream

#include

#include

using

namespace

std;

//using namespace __gnu_pbds;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair pp;

#define rep1(i, a, b) for(int i = a; i < b; i++)

#define rep2(i, a, b) for(int i = a; i <= b; i++)

#define rep3(i, a, b) for(int i = a; i >= b; i--)

#define clr(a, b) memset(a, b, sizeof(a))

#define mp(x, y) make_pair(x,y)

template

inline

void getmax(t1 &a, t2 b)

template

inline

void getmin(t1 &a, t2 b) ;

bool vis[5][5][5][5][5][5][5][5][5];

vector

q[10];

double dfs(int w1, int w2, int w3, int w4, int w5, int w6, int w7, int w8, int w9);

bool flag = 0;

double &x = dp[w1][w2][w3][w4][w5][w6][w7][w8][w9];

for(int i = 0; i < 9; i++)

}if(flag == 0)

//else}}

}if(x == 0) return x = 0;

else

//}}int main()

//cout << " ** " << endl;

double ans = dfs(4, 4, 4, 4, 4, 4, 4, 4, 4);

printf("%.6f\n", ans);

clr(dp, 0);

clr(vis, 0);

rep1(i, 0, 10) q[i].clear();

}}

UVa1637 紙牌遊戲

uva1637 紙牌遊戲 36 張牌分成 9 堆,每堆 4 張牌。每次可以拿走某兩堆頂部的牌,但需要點數相同。如果有多種拿法則等概率的隨機拿。例如,9 堆頂部的牌分別為 ks,kh,kd,9h,8s,8d,7c,7d,6h 則有 5 種拿法 ks,kh ks,kd kh,kd 8s,8d 7c,7d...

UVA1637 紙牌遊戲

36張牌分成9堆,每堆4張牌。每次可以拿走某兩堆頂部的牌,但需要點數相同。如果有 多種拿法則等概率的隨機拿。例如,9堆頂部的牌分別為ks,kh,kd,9h,8s,8d,7c,7d,6h,則有5種拿法 ks,kh ks,kd kh,kd 8s,8d 7c,7d 每種拿法的概率均為1 5。如果最後拿完所...

習題6 9 UVA 127 紙牌遊戲

一道學校oj做的題目,當時卡了兩三天。簡單說下題意 52疊撲克,從左到右發現乙個牌與他的前面3張或者1張 花色或者點數相同時,就把這張牌放到那上面,參與比較的只能是每一疊的第一章!思路 我建立了vector 套了乙個stack stack裡面放了struct,先輸入。1.在輸入方面,最好寫個輸入函式...