设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 3598180To 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”.
