[hiho1159] Poker
Posted HLX_Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[hiho1159] Poker相关的知识,希望对你有一定的参考价值。
1 /* 2 Poker 3 组合dp 4 */ 5 #include<iostream> 6 #include<cstdio> 7 #include<cstdlib> 8 #include<cstring> 9 #include<algorithm> 10 #include<cmath> 11 #define ull unsigned long long 12 using namespace std; 13 14 int num[310],cnt[15]; 15 ull c[55][55],dp[15][55],fac[10]; 16 char alph[15]={"0A23456789TJQK"}; 17 18 int gi() { 19 int x=0,o=1; char ch=getchar(); 20 while(ch!=‘-‘ && (ch<‘0‘ || ch>‘9‘)) ch=getchar(); 21 if(ch==‘-‘) o=-1,ch=getchar(); 22 while(ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); 23 return o*x; 24 } 25 26 void pre() { 27 c[0][0]=1; 28 for(int i=1; i<=52; i++) { 29 c[i][0]=c[i][i]=1; 30 for(int j=1; j<i; j++) { 31 c[i][j]=c[i-1][j-1]+c[i-1][j]; 32 } 33 } 34 for(int i=1; i<=13; i++) num[alph[i]]=i; 35 fac[0]=1; 36 for(int i=1; i<=4; i++) fac[i]=fac[i-1]*i; 37 } 38 39 int main() { 40 pre(); 41 int T=gi(),tot,n,t=0; 42 while(T--) { 43 n=gi(),tot=0; 44 memset(cnt,0,sizeof(cnt)); 45 for(int i=1; i<=n; i++) { 46 char s[3]; 47 scanf("%s", s); 48 cnt[num[s[0]]]++; 49 } 50 memset(dp,0,sizeof(dp)); 51 dp[0][0]=1; 52 for(int i=1; i<=13; i++) { 53 if(cnt[i]==0) { 54 for(int j=0; j<=max(0,tot-1); j++) 55 dp[i][j]=dp[i-1][j]; 56 continue; 57 } 58 for(int j=0; j<=max(0,tot-1); j++) 59 for(int k=1; k<=cnt[i]; k++) 60 for(int l=0; l<=k; l++) 61 if(j+cnt[i]-k-l>=0) 62 dp[i][j+cnt[i]-k-l]+=dp[i-1][j]*c[cnt[i]-1][k-1]*c[j][l]*c[tot+1-j][k-l]; 63 tot+=cnt[i]; 64 } 65 ull ans=dp[13][0]; 66 for(int i=1; i<=13; i++) { 67 ans=ans*fac[cnt[i]]; 68 } 69 printf("Case #%d: %llu\n", ++t,ans); 70 } 71 }
以上是关于[hiho1159] Poker的主要内容,如果未能解决你的问题,请参考以下文章