牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
思路分析
对于动态规划的问题,一定要找准对应求的子问题,根据简单容易求出的初始值,来带入计算得到相应的每一步子问题的答案,最终可以得到想要的结果。具体步骤如下:
1、分解成子问题
例本题中,a[13][13]表示在13种牌中取出13张,可以先依次求a[6][5],a[3][4],a[2][2]的解,有简单向后去求。
2、初始值的计算
这里初始值为,a[1][0]=a[1][1]=a[1][2]=a[1][3]=a[1][4]=1;如果只有一种牌的话,不管要取多少张只有一种方法。
3、使用循环的嵌套,注意每一层循环所表示的含义
4、子问题的求解,要利用上一层所得到的解
5、使用二维数组,得到自己想要的答案
这里根据题意可知a[13][13]为要求的答案
#include<stdio.h >
int a[14][14]={0}; //a[i][j]表示在 i种牌中取出 j张一共有多少种取法
int main(){
int i,j,k;
a[1][0]=a[1][1]=a[1][2]=a[1][3]=a[1][4]=1; //动态规划必须算出前几个作为初值
for(i=2;i<14;i++){ //i表示共有i种牌
for(j=0;j<14;j++){ //j表示一共需要多少张
//以下实现部分,需要想出办法
//例如求 a[6][5],即是从 6种牌中取出 5张来,我们可以将这 6种看成前 5种加上第六种
//所以可以得出,前五种取出 5张即 a[5][5],第六种取出 0种
//所以可以得出,前五种取出 4张即 a[5][4],第六种取出 1种
//所以可以得出,前五种取出 3张即 a[5][3],第六种取出 2种
//所以可以得出,前五种取出 2张即 a[5][2],第六种取出 3种
//所以可以得出,前五种取出 1张即 a[5][1],第六种取出 4种
//又因为每一种牌最多只可以取出 4张,所以只有以上 5个相加
//特别注意,j小于 4的时候,即取出的牌数小于4张,则新加入的那一种牌取不到4张,相应种类数会减少,不构成5种相加
for(k=0;k<5;k++){
if(j-k>=0){
a[i][j]=a[i][j]+a[i-1][j-k];
}
}
}
}
printf("%d",a[13][13]);
return 0;
}