算法题01:递归:红篮球问题

m 0 m\ge 0 个同样的红球, n 0 n\ge0 个同样的蓝球排成一行。对排法要求如下:任意某个蓝球左侧的红球个数大于等于其左侧的蓝球个数加1(即蓝球个数计数时包含当前蓝球),例如:下列合法的排法1中,从左数到的第1个蓝球左侧有2个红球,所以满足 2 1 2\ge 1 ;且数到的第2个蓝球左侧有2个红球,满足 2 2 2\ge2 ,所以是合法排列。

例如

  • 合法的排法1: \textcolor{red}{\bigcirc} \textcolor{red}{\bigcirc} \textcolor{blue}{\bigcirc} \textcolor{blue}{\bigcirc}

  • 合法的排法2: \textcolor{red}{\bigcirc} \textcolor{blue}{\bigcirc} \textcolor{red}{\bigcirc} \textcolor{blue}{\bigcirc}

  • 非法排列: \textcolor{red}{\bigcirc} \textcolor{blue}{\bigcirc} \textcolor{blue}{\bigcirc}\textcolor{red}{\bigcirc}

总共有多少种合法的排法方式(分析递归表达式,要写出分析过程)。

解答

写出递归表达式和分析

A = { A ( 0 , n ) = 0  for  n 0 A ( m , 0 ) = 1  for  m 1 A ( m , 1 ) = m  for  m 1 A ( m , n ) = 0  for  m < n A ( m , n ) = A ( m , n 1 ) + A ( m 1 , n )  for  m n A=\left\{\begin{array}{lll} A(0,n)=0 & \text { for } & n\geq 0 \\ A(m,0)=1 & \text { for } & m\geq 1 \\ A(m,1)=m & \text { for } & m\geq1 \\ A(m,n)=0 & \text { for } & m < n \\ A(m,n)=A(m,n-1)+A(m-1,n) & \text{ for } & m\geq n\\ \end{array}\right.

对于A(0,n) = 0 , n>=0

​ //因为没有红球,所以必然没有一种排列合法

对于A(m,0) = 1 , m>=1

//因为没有蓝球,所以合法排列为一种,全为红排列

对于A(m,1) = m , m>=1

//当m=1时,A(1,1) = 1=m ,当m>1时,在m+1个位置上,只有第一个位置不能放蓝球,所以合法排列为 m+1 -1=m

对于A(m,n) = 0 , m< n

//红球个数小于蓝球时,设任意某个蓝球左侧的红球为m0个,必然有m0<=m,无论任何一种排列,对其从右到左的第一个蓝球,必有其左侧+1蓝球数为n, 显然 m0<=m<n,所以合法排列为0种。

对于A(m,n) = A(m, n-1)+ A(m-1, n) , m>=n

//把A(m,n)排列理解为在已有的合法排列的最后加上一个球,则有两种必不重复的排法,一、加红球,二、加蓝球。那么,只需将两种情况相加即可。也就是A(m,n) = 少一个红球的情况+少一个蓝球的情况。然后对应的两种情况又继续按上面的理解,递归到前一项,直到最开始的限制条件。

​ 这个题做了很久都是因为还没有习惯递归的思维,总是想的很复杂,想着找红球蓝球的位置的特征:比如在排列后面加红球必然合法等等,思维局限在通过找合法的排列来找到前一项与后一项的关系,然而递归的思想是"假设"前一项成立,直接找先后两项的关系,自己下套把自己整蒙了。本来想着先分类写几项,结果A(4,3)就已经有很多了,但是在写的时候也有刻意掺杂递归的思想来排列,所以在写排列的时候观察到了一些规律,受到了启发。

发布了27 篇原创文章 · 获赞 19 · 访问量 4537

猜你喜欢

转载自blog.csdn.net/qq_43617268/article/details/104941661