问个问题,快把我整糊涂了。
★ 问题描述:
表达式中可以添加一定的括号来实现不同的优先级计算,我们称这些表达式
为括号表达式。对于4 个字母组成的表达式,共有11 种可能的括号表达式,如
xxxx, (xx)xx, x(xx)x, xx(xx), (xxx)x, x(xxx), ((xx)x)x, (x(xx))x,
(xx)(xx), x((xx)x), x(x(xx))。其中每个括号中必须包括大于等于两个的字母,
或者不添加任何括号,如xx(x)x,(x(x)xx)都是不合法的。
★实验任务:
给定表达式的字母个数,请计算出不同括号表达式的数量。
★数据输入:
输入数据的第一行为一个正整数n(2<n≤300),表示表达式中字母的个数。
★结果输出:
对于每组输入数据输出一行一个整数C,表示不同括号表达式的数量。
输入示例1 输出示例1
3 3
输入示例2 输出示例2
4 11
输入示例3 输出示例3
6 197
我用分治写的代码,发现怎么写都不对,越想越乱。
int bracketSolve(int left,int right){ if(right-left==1)//如果剩一个,就1种加括号方法 { return 1; } if(right-left==0)//剩两个,可以选择加或不加,共2种方法 { return 2; } int i=left; int count=0; while(i<right)//i表示在i,i+1之断开。 { count+=bracketSolve(left,i)*bracketSolve(i+1,right); i++; } return count+1;//我想不明白,括号在加与不加之间情况下的状况。。。乱了}void main(){ cout<<bracketSolve(1,4);}
#include <iostream>using namespace std;int bracketSolve(int left,int right){ if(right-left==0)//如果剩一个,计算顺序只有一种 { return 1; } if(right-left==1)//剩两个,计算顺序也只有一种 { return 1; } int i=left; int count=0; while(i<right)//i表示在i,i+1之断开。 { count+=bracketSolve(left,i)*bracketSolve(i+1,right); i++; } return count;}void main(){ cout<<bracketSolve(1,4);}
[解决办法]
整数划分的意思如下,按照LZ给的例子来看,算起来跟catalan数稍有区别。
x 1
xx 1+1
xxx 1+1+1
(xx)x 2+1
x(xx) 1+2
xxxx 1+1+1+1
x(xx)x 1+2+1
x((xx)x) 1+3
x(xxx) 1+3
x(x(xx)) 1+3
xx(xx) 1+1+2
(xx)xx 2+1+1
(xx)(xx) 2+2
(xxx)x 3+1
((xx)x)x 3+1
(x(xx))x 3+1
[解决办法]
ygfioufyukfhkf
[解决办法]
就是指4对应的整形划分,1+3和3+1都有3个,因为f(3) = 3,所以有三个。
LZ可以先看看catalan数的递推方法,就能分析出来这个递推式了。
f(1) = 1
f(2) = 1
f(3) = 3
f(4) = 11
其中f(3)的计算可以由f(1)和f(2)推出,f(4)可由f(1),f(2),f(3)推出,后面的f(5)可由f(1)-f(4)推出,
以此类推。因此LZ需要先看的是catalan数的递推方法,而不是那个c(2n,n)/(n+1)的通项公式。