1251 括号

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)

数据范围及提示 Data Size & Hint
 

分类标签 Tags 点此展开 

 
 

题目描述:给定n个变量,求乘积的表达式的个数。相邻元素相乘需要加*号。

思路:直接递归即可,ans[i][j] = ans[i][k]+ans[k+1][j](i<=k<j);对于单个字符而言,没有括号

不要尝试从样例数据的输出中寻找什么规律,事实上就是把这些字符串的前几个组合后几个组合(因为每个组合会有多种情况,所以返回的是字符串数组),再把两个的合并,那么就枚举前后组合的长度,边界,一个字符串,直接返回,两个字符串,中间加乘号,两边加括号返回
#include<iostream> 
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
vector<string>ans[20][15];
string a[20];
void dfs(int l,int r){
    string s;
    if(ans[l][r].size()) return ;
    if(l==r){
        ans[l][r].push_back(a[l]);
    }
    else{
        for(int i=l;i<r;i++){
            dfs(l,i);
            dfs(i+1,r);
            int m1=ans[l][i].size(),m2=ans[i+1][r].size();
            for(int j=0;j<m1;j++){
                for(int k=0;k<m2;k++){
                    if(l==i&&i+1==r)
                        s="("+ans[l][i][j]+"*"+ans[i+1][r][k]+")";
                    else
                        s="("+ans[l][i][j]+ans[i+1][r][k]+")";
            
                    ans[l][r].push_back(s);
                }
            }
            
            
        }
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    dfs(1,n);
    int t=ans[1][n].size();
    for(int i=0;i<t;i++)
        cout<<ans[1][n][i]<<endl;
    return 0;
}

 

posted @ 2016-06-12 21:07  神犇(shenben)  阅读(362)  评论(0编辑  收藏  举报