牌型种类

一、题目

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

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

二、方法一:深度优先搜索(dfs)

    static int sum = 0;
    // n代表第n种牌,cartNum代表此时手中牌的总数
    public static void dfs(int n, int cartNum) {
        if (n > 13) {//到了第13种牌,回溯
            return;
        }
        if (cartNum >= 13) {
            if (cartNum == 13)//牌数达到13张
                sum++;
            return;
        } else {
            dfs(n + 1, cartNum);//第n种牌放0张,开始放下一种牌
            dfs(n + 1, cartNum + 1);//第n种牌放1张,开始放下一种牌
            dfs(n + 1, cartNum + 2);//第n种牌放2张,开始放下一种牌
            dfs(n + 1, cartNum + 3);//第n种牌放3张,开始放下一种牌
            dfs(n + 1, cartNum + 4);//第n种牌放4张,开始放下一种牌
        }
    }
    public static void main(String[] args) {
          dfs(0, 0);//从0开始代表第一种牌
          System.out.println(sum); 
    }

三、方法二:动态规划

设dp[i][j]表示i种牌在牌总数为j时的牌型组合数。
初始状态:在只有1种牌时,不管牌总数有多少均只有一种组合。
dp[i][k]可以由dp[i-1][k],dp[i-1][k-1],dp[i-1][k-2],dp[i-1][k-3],dp[i-1][k-4]累加得到。(分别对应第i-1种牌放0,1,2,3,4张牌时五种情况)

public static void main(String[] args) {
        int dp[][] = new int[14][14];
        //初始化
        dp[1][0] = dp[1][1] = dp[1][2] = dp[1][3] = dp[1][4] = 1;
        for (int i = 2; i <= 13; i++) {//i代表第几种牌
            for (int k = 0; k <= 13; k++) {//k代表牌总数
                if (k - 4 >= 0) {
                    dp[i][k] += dp[i - 1][k - 4];
                }
                if (k - 3 >= 0) {
                    dp[i][k] += dp[i - 1][k - 3];
                }
                if (k - 2 >= 0) {
                    dp[i][k] += dp[i - 1][k - 2];
                }
                if (k - 1 >= 0) {
                    dp[i][k] += dp[i - 1][k - 1];
                }
                dp[i][k] += dp[i - 1][k];
            }
        }
        //打印dp数组
        for (int i = 0; i < dp.length; i++) {
            for (int j = 0; j < dp[i].length; j++) {
                System.out.print(dp[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println(dp[13][13]);

    }

打印的dp数组:
从上往下代表第i种牌,从左往右代表共j张牌,dp[i][j]即为对应的组合数。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 0 0 0 0 0 0 0 0 0 
1 2 3 4 5 4 3 2 1 0 0 0 0 0 
1 3 6 10 15 18 19 18 15 10 6 3 1 0 
1 4 10 20 35 52 68 80 85 80 68 52 35 20 
1 5 15 35 70 121 185 255 320 365 381 365 320 255 
1 6 21 56 126 246 426 666 951 1246 1506 1686 1751 1686 
1 7 28 84 210 455 875 1520 2415 3535 4795 6055 7140 7875 
1 8 36 120 330 784 1652 3144 5475 8800 13140 18320 23940 29400 
1 9 45 165 495 1278 2922 6030 11385 19855 32211 48879 69675 93600 
1 10 55 220 715 1992 4905 10890 22110 41470 72403 118360 182005 264220 
1 11 66 286 1001 2992 7887 18722 40612 81367 151778 265233 436348 678458 
1 12 78 364 1365 4356 12232 30888 71214 151580 300366 557712 975338 1613184 
1 13 91 455 1820 6175 18395 49205 120055 270270 566280 1111760 2056210 3598180 

To strive for a specific aim is the “ideal”.To get something done with one vigorous effort is the “willpower”.The combination of the two is “ambition”.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值