zoukankan      html  css  js  c++  java
  • 5个0,4个1组成的字符串中,出现01或10的次数为4的不同字符串个数

    题:(1)5个0,4个1组成的字符串中,出现01或10的次数为4的不同字符串个数

    (2)一般地,n个0,m个1组成的字符串中,出现01或10的次数为k的不同字符串个数

    例如,10100011是一个满足要求的字符串(这里10和01是可以重用的,例如,010算是出现1次01,出现1次10)

    (这是刚刚考过的组合数学期末试题,表示没能当场做出,选错方法了- -我用了递推法,写出了递归式但是不会解,因为有n、m、k三个参数——这也许不是正确的方法)

    ----------------------

    符号说明:

    1)N01和N10分别表示字符串中01的个数和10的个数

    2)N=N01+N10表示字符串中01和10的总出现次数

    3)C(n,m)表示n个不同元素中取m个元素的组合数

    ----------------------

    (1)注意到:我们可以把字符串中连续的0用1个0替换而不改变N01和N10的个数(N01和N10分别表示字符串中01的个数和10的个数),同理也可以把字符串中连续的1用1个1替换,为叙述方便,称得到的为原字符串的“模式”

    比如,10100011的模式是10101

    下面考虑有几种可能的模式呢?

    思路:我们考虑0的可能位置(考虑1也可以),如果0在左端,则对N01的贡献为1;若在右端,则对N10的贡献为1;若在中间(非端点),则对N10和N01的贡献各为1,总贡献为2

    01或10出现次数为4,那么0在模式中出现的情况有以下几种可能:

    (1)中间没有0——这不可能,因为即使两端都出现0,01或10出现总次数也只有2

    (2)中间有1个0——这1个0对N的贡献为2,那么两端必然都必须为0,这样才会有N=4。模式为01010

    (3)中间有2个0——这2个0对N的贡献为4,两端必然都必须为1,模式为10101

    (4)中间有超过2个0——这不可能

    总结起来只有两种可能的模式:01010和10101

    (还可以从模式的角度找规律,其实长为n的模式只有两种,分别是以0开头的01交替序列和以1开头的01交替序列,而且这两个模式对应的N是相同的,即包含01和10的总数是相同的。因此n和N之间构成了一一对应。n为偶数时,模式为0101…01或1010…10,对应N=n-1;n为奇数时,模式为0101…010或1010…101,对应N=n-1.所以总是有N=n-1,所以你告诉我N=4,那么对应的一定是长为5的两个模式,这种方法似乎更简单)

    找到模式之后,怎么计算对应的字符串有多少个呢?

    对模式01010,设“01010”的第1个0在原字符串代表x1个0,第2个0代表x2个0,第3个0代表x3个0,则有x1+x2+x3=5,不同的x1,x2,x3的取值对应的字符串是不同的,同样每个符合模式01010的字符串也都对应了这样一组正整数(x1,x2,x3),这是一一对应。求出这个不定方程的正整数解的个数就可以了,即为在5个相同的球之间插入2个隔板的方法数,是C(4,2)。同样设“01010”的第1个1和第2个1在原字符串中分别代表y1个1和y2个1,有y1+y2=4,正整数解个数为C(3,1)

    因此,由乘法原则,这种模式对应的字符串有C(4,2)* C(3,1)=18个

    类似可以求出10101对应的字符串有C(4,1)* C(3,2)=12个

    所以,有30个满足要求的字符串。

    (2)一般情况,方法是一样的

    n个0,m个1,出现01或10的次数为k

    k为偶数时,可能的模式有两个:

    一个是1010…01,其中有k/2个0, k/2+1个1.对应的不定方程为:

    X1+ X2+ …+Xk/2=n

    y1+ y2+ …+yk/2+1=m

    解的个数是C(n-1,k/2-1)*C(m-1,k/2)

    另一个是010…010,其中有k/2+1个0, k/2个1.对应的不定方程为:

    X1+ X2+ …+Xk/2+1=n

    y1+ y2+ …+yk/2=m

    解的个数是C(n-1,k/2)*C(m-1,k/2-1)

    总的符合要求的字符串数为C(n-1,k/2-1)*C(m-1,k/2)+ C(n-1,k/2)*C(m-1,k/2-1)

    k为奇数时,可能的模式也有两个:

    一个是010…01,其中有(k+1)/2个0, (k+1)/2个1.对应的不定方程为:

    X1+ X2+ …+X(k+1)/2=n

    y1+ y2+ …+y(k+1)/2=m

    解的个数是C(n-1,(k-1)/2)*C(m-1, (k-1)/2)

    另一个是10…010,其中同样是有(k+1)/2个0, (k+1)/2个1.对应的不定方程及解的个数和上一个一样,也是C(n-1,(k-1)/2)*C(m-1, (k-1)/2)个解。

    总的符合要求的字符串数为2*C(n-1,(k-1)/2)*C(m-1, (k-1)/2)

    --

    ps:1楼给出了另一种思路,往下看

  • 相关阅读:
    汉字机内码的特点
    while(~scanf(..))的用法
    【C语言】八进制转十进制
    【C语言】按字典顺序排序
    【C语言】矩阵相乘
    【C语言】魔方阵
    【C语言】统计候选人的得票数
    【C语言】对输入的字符串中C关键词的查找统计
    20201231《信息安全导论》第十二周学习总结
    20201231《信息安全导论》第十一周学习总结
  • 原文地址:https://www.cnblogs.com/fstang/p/2870583.html
Copyright © 2011-2022 走看看