[hiho1159] Poker
生活随笔
收集整理的這篇文章主要介紹了
[hiho1159] Poker
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
題意:給你一副撲克中的幾張牌,要你將這些牌進行排列,并且相鄰的牌數字不能相同
?
題解:
dp(組合數)
dp[i][j]表示放到第i種數字,有j個數字相同且相鄰的方案數
1、對于同一種數字,可以將其劃分為k組,有C(cnt[i]-1,k-1)種分法
2、考慮將這k組中的l組放到數字相同的中間,其余放置任意位置,則分別有:
C(j,l)和C(tot+1-j,k-l)種放法(tot表示前面有多少張牌)
那么就可已轉移了
設x為放完后的同花色相鄰,則x=j+a[i]-k-l
dp[i][x]+=C(j,l) * C(tot+1-j,k-l)* C(cnt[i]-1,k-1) * dp[i-1][j]
?
/*Poker組合dp */ #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #define ull unsigned long long using namespace std;int num[310],cnt[15]; ull c[55][55],dp[15][55],fac[10]; char alph[15]={"0A23456789TJQK"};int gi() {int x=0,o=1; char ch=getchar();while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') o=-1,ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return o*x; }void pre() {c[0][0]=1;for(int i=1; i<=52; i++) {c[i][0]=c[i][i]=1;for(int j=1; j<i; j++) {c[i][j]=c[i-1][j-1]+c[i-1][j];}}for(int i=1; i<=13; i++) num[alph[i]]=i;fac[0]=1;for(int i=1; i<=4; i++) fac[i]=fac[i-1]*i; }int main() {pre();int T=gi(),tot,n,t=0;while(T--) {n=gi(),tot=0;memset(cnt,0,sizeof(cnt));for(int i=1; i<=n; i++) {char s[3];scanf("%s", s);cnt[num[s[0]]]++;}memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=1; i<=13; i++) {if(cnt[i]==0) {for(int j=0; j<=max(0,tot-1); j++)dp[i][j]=dp[i-1][j];continue;}for(int j=0; j<=max(0,tot-1); j++) for(int k=1; k<=cnt[i]; k++) for(int l=0; l<=k; l++) if(j+cnt[i]-k-l>=0)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];tot+=cnt[i];}ull ans=dp[13][0];for(int i=1; i<=13; i++) {ans=ans*fac[cnt[i]];}printf("Case #%d: %llu\n", ++t,ans);} }?
轉載于:https://www.cnblogs.com/HLXZZ/p/7593768.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的[hiho1159] Poker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ls -Slh
- 下一篇: 部署harbor1.2.0开启ldap验