蓝桥杯-动态规划-牌型种数

牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字。

题解及代码

#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))//²»ÄÜmem(double)
#define ll long long
const double eps=3e-8;
const int mod=10;
const int maxn=1005;
int sum=0;
int a[20];
void dfs(int cur,int num){
    if(cur>13)return;//cur>13要返回!!!范围是[0,13]
    if(num>=13){
        if(num==13){
            sum++;
        }
        else return;//num>13要返回!!!
    }
    else{
        for(int i=0;i<=4;i++){
            a[cur]=i;
            dfs(cur+1,num+i);
        }
    }
}
int dp[20][20];//表示i种牌,j个牌的种类数量
int solve(){
    ///正常DP
    mem(dp,0);
    for(int i=0;i<5;i++)dp[1][i]=1;//只有一种牌的时候,怎么组合都是1
    for(int i=2;i<=13;i++){//其实和i没什么关系。。。(可以滚动数组)
        for(int j=0;j<=13;j++){
            dp[i][j]+=dp[i-1][j];//主要看j的坐标可以等于0(注意细节)   dp[i][j]==0
            if(j-1>=0)dp[i][j]+=dp[i-1][j-1];
            if(j-2>=0)dp[i][j]+=dp[i-1][j-2];
            if(j-3>=0)dp[i][j]+=dp[i-1][j-3];
            if(j-4>=0)dp[i][j]+=dp[i-1][j-4];
            //cout<<" "<=0)d[i][j]+=d[1-i][j-1];
            if(j-2>=0)d[i][j]+=d[1-i][j-2];
            if(j-3>=0)d[i][j]+=d[1-i][j-3];
            if(j-4>=0)d[i][j]+=d[1-i][j-4];
            //cout<<" "<

答案:3598180

你可能感兴趣的:(算法题解)