zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    python 模拟浏览器
    转:如何评价架构的优劣
    转:DotNET企业架构应用实践架构师成长之路如何成为优秀架构师
    转:大规模网站架构实战之体系结构(一)
    转:Twitter的设计原则
    转:关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性
    转:我眼中的Visual Studio 2010架构工具
    转:解剖Twitter
    转:Discuz!NT前台模型架构(MVC)
    转: "HTTP 错误 401.1 未经授权:访问由于凭据无效被拒绝"的另类解决方案
  • 原文地址:https://www.cnblogs.com/shenben/p/5578764.html
Copyright © 2011-2022 走看看