首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

问个有关问题,快把小弟我整糊涂了

2012-02-04 
问个问题,快把我整糊涂了。★ 问题描述:表达式中可以添加一定的括号来实现不同的优先级计算,我们称这些表达

问个问题,快把我整糊涂了。
★ 问题描述:
表达式中可以添加一定的括号来实现不同的优先级计算,我们称这些表达式
为括号表达式。对于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


我用分治写的代码,发现怎么写都不对,越想越乱。

C/C++ code
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);}  


到底哪里混乱了。求修改


[解决办法]
>bracketSolve(left,i)*bracketSolve(i+1,right);
有这个就不可能对了。乃得保证(xx)(xx)(xx)没有被计算2次。
[解决办法]
数量确实不少,真怀疑int64能否够用。先考虑整数的划分,划分出来的部分如果大于2,
还要递归划分,不过可以DP,速度倒是不会太慢,只是数量可能会很大。
[解决办法]
探讨
★ 问题描述:
表达式中可以添加一定的括号来实现不同的优先级计算,我们称这些表达式
为括号表达式。对于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))。其中每个括号中必须包括大于等于两个的字母,……

[解决办法]
探讨
>bracketSolve(left,i)*bracketSolve(i+1,right);
有这个就不可能对了。乃得保证(xx)(xx)(xx)没有被计算2次。

[解决办法]
(xx)xx和 (xxx)x的计算顺序不是一样的吗?
我觉得题目可能在求catalan数,看看这个网页就知道了
http://www.cppblog.com/zhgw01/archive/2008/06/05/52306.html
如果按照catalan数来求的话,那么输入4结果应该为5.
C/C++ code
#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)的通项公式。

探讨

楼上的大大,你给一串例子,我不明白什么意思呀。

x((xx)x) 1+3
x(xxx) 1+3
x(x(xx)) 1+3

这些1+3是什么东西,还有为什么从1个x开始一直扩展到4个x,这是一个递推过程么?。。看不出门道。



还有整数划分,是指一个整数k,找出有多少种加和方式的那个整数划分还是说把数xxxx分成两半。。

麻烦讲解一下,谢谢你了

热点排行