題意: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.在輸入方面,最好寫個輸入函式...