`
cjc
  • 浏览: 692302 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于括号式子的计数

阅读更多
  • CSDN
  • CSDN社区
  • 专题开发/技术/项目
  • 数据结构与算法
  • 超超版主的问题:

    如果有n对括号,组成一个式子,而且括号的最深嵌套层次为k
    满足这个条件的式子一共有几种?
    如果n=3,k=2则有3种:
    (())()
    ()(())
    (()())

    能否找到递推公式? 

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

    tailzhou  网友的解答:

    对于特定的 n,k;
    深度为k的子式子最少有k个括号,最多有n个括号

    对由i(i >=k and i <=n)个括号组成的深度为k的式子可以由dp数组得到;
    其他的n-i个括号分布在深度为k的子式子的前后;

    为了不重复统计,规定上面深度为k的子式子是 大式子中的第一个深度为k的子式子;

    分别对前面有j(j >=0,j <=n-i,并且这k个括号组成的式子的最大深度不能大于k-1,也就是最大深度从1到k-1的总数的和)个括号,后面有n-i-j(并且这n-i-j个括号组成的式子的最大深度不能大于k)个括号的情况统计;


    #include  <stdio.h >

    #define MAX_N 20

    int dp[MAX_N+1][MAX_N+1];

    void fun(int n,int k)
    {
    int i,j;
    for (i=k;i <n;++i)
    {
    int tmp=0;

    for (j=0;j <=n-i;++j)
    {
      int tmp_i=j;
    int tmp_j=n-i-j;
    int tmp_k1=0,tmp_k2=0;
    if (tmp_i >k-1) tmp_i=k-1;
    if (tmp_j >k) tmp_j=k;

    for (;tmp_i >0 ; tmp_i--)
    {
    tmp_k1+=dp[j][tmp_i];
    }
    for (;tmp_j >0 ; tmp_j--)
    {
    tmp_k2+=dp[n-i-j][tmp_j] ;
    }

    if (tmp_k1 <1) tmp_k1=1;
    if (tmp_k2 <1) tmp_k2=1;

    tmp+=tmp_k1*tmp_k2;

    }
    dp[n][k]+=dp[i-1][k-1]*tmp;
    }
    dp[n][k]+=dp[n-1][k-1];
    }

    int main(int argc, char* argv[])
    {

    //最深嵌套层次为k,那么肯定存在一个层次为k-1的式子,其外围再有一对括号;
    //这对括号外再没有嵌套的括号;
    int n,k;

    for (n=1; n <=MAX_N; n++)
    {
    dp[n][1]=1;
    dp[n][n]=1;
    }

    for (n=1; n <=MAX_N; n++)
    {
    for (k=1; k <=n; k++)
    {
    if (k!=n && k!=1) fun(n,k);

    printf("n:%3d k:%3d dp:%10d\n",n,k,dp[n][k]);
    }
    }

    fun(20,2);

    printf("input n{max:%d} and k{max:%d}:",MAX_N,MAX_N);
    while (scanf("%d %d",&n,&k)==2)
    {
    printf("%d %d : %d \n" ,n,k,dp[n][k]);
    printf("input n{max:%d} and k{max:%d}:",MAX_N,MAX_N);
    }

    return 0;
    }

    顺手将其改写成VB代码,如下所示:

    Sub fun(ByVal n As Long, ByVal k As Long, ByRef dp())
    Dim i As Long, j As Long, temp As Long, temp_i As Long, temp_j As Long, temp_k1 As Long, temp_k2 As Long
    For i = k To n - 1
    temp = 0
    For j = 0 To n - i
    temp_i = j
    temp_j = n - i - j
    temp_k1 = 0
    temp_k2 = 0
    If temp_i > k - 1 Then temp_i = k - 1
    If temp_j > k Then temp_j = k
    While temp_i > 0
    temp_k1 = temp_k1 + dp(j, temp_i)
    temp_i = temp_i - 1
    Wend
    While temp_j > 0
    temp_k2 = temp_k2 + dp(n - i - j, temp_j)
    temp_j = temp_j - 1
    Wend
    If temp_k1 < 1 Then temp_k1 = 1
    If temp_k2 < 1 Then temp_k2 = 1
    temp = temp + temp_k1 * temp_k2
    Next
    dp(n, k) = dp(n, k) + dp(i - 1, k - 1) * temp
    Next
    dp(n, k) = dp(n, k) + dp(n - 1, k - 1)
    End Sub


    Sub main()
    Dim n As Long, k As Long, max_n As Long
    max_n = 23
    ReDim dp(1 To max_n, 1 To max_n)
    For n = 1 To max_n
    dp(n, 1) = 1
    dp(n, n) = 1
    Next
    For n = 1 To max_n
    For k = 1 To n
    If k > 1 And k < n Then fun n, k, dp
    Next
    Next
    [a1].Resize(max_n, max_n) = dp
    [a1].Resize(max_n, max_n).Columns.AutoFit
    End Sub

    在EXCEL中返回:

    1                                            
    1 1                                          
    1 3 1                                        
    1 7 5 1                                      
    1 15 18 7 1                                    
    1 31 57 33 9 1                                  
    1 63 169 132 52 11 1                                
    1 127 482 484 247 75 13 1                              
    1 255 1341 1684 1053 410 102 15 1                            
    1 511 3669 5661 4199 1975 629 133 17 1                          
    1 1023 9922
    分享到:
    评论

    相关推荐

      能够在输出显示屏上显示所输入的式子,并且能够进行4则混和运算.zip

      在C#编程语言中,创建一个程序来在输出显示屏上显示用户输入的数学式子并执行4则混合运算是一项常见的任务。这涉及到基础的输入输出处理、字符串解析以及算术运算。下面我们将深入探讨这些关键知识点。 首先,C#中...

      电子科技大学组合数学课件

      6. **卡特兰数**:在组合计数中,卡特兰数是一个重要的数列,出现在很多不同的问题中,如括号匹配、分割问题、排列问题等。 7. **图论与组合**:组合数学在图论中有广泛应用,如欧拉路径、哈密顿回路、树的数量计算...

      组合数学算法

      5. **卡特兰数**:卡特兰数是一类在组合数学中频繁出现的数,常见于解决各种计数问题,如括号匹配、格雷码转换等。 6. **递推关系**:许多组合数有递推关系,例如斐波那契数列F(n) = F(n-1) + F(n-2),或者组合数的...

      2020高中数学 1章整合课后练习同步导学 新人教A版选修2-3.doc

      给定式子(a0+a2+a4)^2-(a1+a3)^2可以转化为(a0+a1+a2+a3+a4)(a0-a1+a2-a3+a4),这是两个二项式展开式乘积,其中第一个括号对应(2+x)^4,第二个括号对应(-2+x)^4。计算结果为1。 5. **染色问题**:第5题属于排列组合...

      北师大版数学七年级上册电子课本实用.docx

      - **合并同类项**、**去括号**:简化代数式,为后续的方程求解打下基础。 - **探索规律**:通过实例分析,培养找寻和表达数学规律的能力。 4. **平面图形及其位置关系**: - **线段、射线、直线**:定义和区分...

      初1全部知识点总结.docx

      - 等式的两边同时加上或减去相同的数(或式子),结果仍相等。 - 等式的两边同时乘以相同的数或除以一个不为0的数,结果仍相等。 - 移项是指将等式一边的某项变号后移动到另一边。 - **实际问题的应用:** - ...

      北师大版七年级数学上册 第三章 整式及其加减 单元检测试题(无答案).docx

      5. 单项式的个数:题目中问到式子中单项式的个数,需要识别哪些是单项式,如-a²,5,3x等。 6. 非整式:非整式是指不满足整式定义的表达式,通常含有除法或根号等运算,如1/x。 7. 多项式的次数与项数:多项式的...

      算法分析与设计课件:习题选讲1bywxyz.ppt

      解题方法是使用高精度模拟竖式计算,通过逐位乘以10并加上当前位的数值,然后对bi取模得到结果。例如,可以定义一个函数`div`来实现这个过程。 2. **1021 Couple**:这是一个关于夫妇排列的问题。题目中,夫妇们站...

      江苏省无锡市天一实验学校2015_2016学年七年级数学上学期期中试题苏科版

      题目中列出的式子中,只有a, -2ab, xy, -1, 2/3ab, 1/2c是单项式,共6个。 5. **代数式的构造**:第五题要求构建代数式,"m的3倍与n的差的平方"可以表示为(3m-n)^2。 6. **方程的解**:第六题是关于解方程的问题。...

      卡特兰数各种算法.rar

      2. ** Dyck 字符串**:在计算机科学中,Dyck 字符串是包含 n 对匹配的开闭括号的字符串,且任意子字符串中开括号的数目都不超过闭括号的数目。例如,对于 n=2,Dyck 字符串只有两个:`()()` 和 `(()())`。 3. **...

      A Collection of Dynamic Programming Interview Questions Solved in C++

      卡特兰数在许多计数问题中出现,如括号匹配、二叉树计数等。动态规划可以通过递归和记忆化的方式高效地计算出卡特兰数。 5. 整数背包问题(Integer Knapsack) 整数背包问题是背包问题的一种,要求在不超过背包容量...

      四年级数学上册教材梳理数与代数西师大版

      2. **无括号的两步式题运算顺序**:在没有括号的算式中,如果涉及同级运算,应当按照从左到右的顺序进行。例如:90-40×2=10;350÷50+20=27。 3. **带括号的混合运算**:小括号的作用在于改变运算顺序,先算括号内...

      人教版小学四年级数学下册期中复习资料电子教案.pdf

      这份人教版小学四年级... - 涉及加、减、乘、除的基本运算,以及括号内的运算优先级,解决实际问题中的数学应用。 以上知识点涵盖了小学四年级数学的核心内容,旨在帮助学生巩固基础,提升计算能力和问题解决能力。

      算法分析习题选讲.ppt

      这里给出的解题思路是采用模拟竖式计算的方法,通过逐位进行乘法和取模运算来解决。这种算法虽然简单直观,但效率相对较低,适用于数据规模较小的情况。 接着,我们讨论【1021 Couple】。这道问题涉及到图形理论和...

      组合数学答案

      - 卡特兰数在组合计数中有多种应用,如括号序列、格子路径等,是组合数学中的重要数列。 7. **杨辉三角**: - 杨辉三角提供了二项式系数的简便查找方式,每个数是其上方两数之和,对应组合数的性质。 8. **递归...

      七年级数学上册第2章整式的加减测试题及答案精选.doc

      9. **多项式的意义**:式子`a+b^2`可以表示一个数的平方与另一个数的和。 10. **实际问题建模**:铁丝长度的问题涉及到减法运算和几何问题,通过建立方程来求解剩余铁丝长度。 11. **图形计数**:火柴棒图形问题...

      幼儿园教案2021-数学教案:玩玩填空题.doc

      - 教师首先展示皮球和水果,引导幼儿观察和计数,理解总数与部分数的区分,并列出相应的加减法式子。 - 幼儿进行对应口头练习,明确部分数和总数的概念,如7+3=10等,训练他们识别部分数和总数的能力。 - 幼儿...

      算法与数据结构 经典例子与优秀解答源码

      ,repeat最长重复子串,rail车皮排序,railpk最优平行轨道车皮排序,railkk有限转轨栈车皮排序,post邮局选址,poly实系数一元式,pattern模式匹配,pipe油井选址,net集成电路等价类,paren括号匹配,maze小鼠迷宫...

      jQuery Selectors(选择器)的使用(七、子元素篇)

      使用这些子元素选择器时,需要注意选择器后面紧跟的括号内可以填写具体的参数,这些参数定义了选择器如何选取目标元素。在使用时,开发者需要根据实际的DOM结构来决定选择器的具体用法。 本系列文章通过实例来进行...

      小数点加减法专项练习卷2.doc

      此外,还有简算题目,如(1)27.3+73.2+72.7,可以观察到27.3和72.7相加等于100,所以整个式子等于100+73.2=173.2,这展示了加法的结合律。 在辨析正误的环节,我们需要判断是否符合小数加减法的运算规则。例如,第二...

    Global site tag (gtag.js) - Google Analytics