COdevs 1251 括号

时间限制: 1 s     空间限制: 128000 KB     题目等级 : 黄金 Gold
题目描述  Description

计算乘法时,我们可以添加括号,来改变相乘的顺序,比如计算X1, X2, X3, X4, …, XN的积,可以

(X1(X2(X3(X4(...(XN-1*XN)...)))))

:::

:::

(((...(((X1*X2)X3)X4)...)XN-1)XN)

你的任务是编程求出所有这样的添括号的方案。

输入描述  Input Description

输入文件第一行是一个数n(1<=n<=10),表示有n个变量,之后N行每行一个变量的名字。

输出描述  Output Description

输出所有的添加括号的方案。注意:单个字符不要加括号,两个字符相乘中间要有乘号。

样例输入  Sample Input

4

North 

South 

East 

West

样例输出  Sample Output

(North(South(East*West)))

(North((South*East)West))

((North*South)(East*West))

((North(South*East))West)

(((North*South)East)West)

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<vector>
 5 
 6 using namespace std;
 7 vector<string> dfs(string *ss,int begin,int end)
 8 {
 9     vector<string> ret;
10     if(begin>end) return ret;
11     if(begin==end)
12     {
13         ret.push_back(ss[begin]);
14         return ret;
15     }
16     if(begin+1==end)
17     {
18         string s='('+ss[begin]+'*'+ss[end]+')';//最中间的合并 
19         ret.push_back(s);
20         return ret;
21     }
22     int size1,size2;
23     for(int i=begin;i<end;i++)
24     {
25         vector<string> s1=dfs(ss,begin,i);
26         vector<string> s2=dfs(ss,i+1,end);
27         size1=s1.size();size2=s2.size();
28         for(int j=0;j<size1;j++)
29         {
30             for(int k=0;k<size2;k++)
31             {
32                 string s='('+s1[j]+s2[k]+')';// 注意题目中说这里是没有乘号的   后续的合并 
33                 ret.push_back(s);
34             }
35         }
36     }
37     return ret;
38 }
39 int main()
40 {
41     string ss[15];
42     int n;
43     scanf("%d",&n);
44     for(int i=1;i<=n;i++)
45       cin>>ss[i];
46     vector<string> ans=dfs(ss,1,n);
47     int size=ans.size();
48     for(int i=0;i<size;i++)
49         cout<<ans[i]<<endl;
50     return 0;
51 }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七情六欲·

学生党不容易~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值