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 点此展开

So,具体思路见题解,好了不多说了,上题解:

#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<string>ans[12][12];
string str[11];
int n;
void dfs(int l,int r)  // l,r单词的分割数目,初始还没求得所要的串,结果为空
{
    if(ans[l][r].size())  // 存放第一个 首单词 位置为 l 尾单词位置为r的 单词串
        return;
    if(l==r)  // 仅有单个单词,放到对应的位置上
        ans[l][l].push_back(str[l]);
    else{
        for(int i=l;i<r;i++){
            dfs(l,i);
            dfs(i+1,r);  // 递归求解,各左右子串的划分形式。
            int sl=ans[l][i].size(),
            sr=ans[i+1][r].size();
            for (int j=0;j<sl;j++){  // 进行连接运算
                for (int k=0; k<sr;k++){
                    string s;
                    s ="("+ans[l][i][j];
                    if (r-l==1) //
                        s+="*";  // 做连接运算时加*号
                    s+=(ans[i+1][r][k]+")");
                    ans[l][r].push_back(s);    // 存入一种结果
                }
            }
        }
    }
}
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>str[i];
    dfs(1,n);
    int m=ans[1][n].size();
    for (int i=0;i<m;i++)
        cout<<ans[1][n][i]<<endl; // 输出所有可能结果
    return 0;
}
如果对你有所帮助,别忘了加好评哦;么么哒!!下次见!88
时间: 2024-07-28 22:16:07

1251 括号(递归小练)的相关文章

递归小练

递归练习1: 求2*4*(2n)的积: 五个人选班长,分别是,张三,李四,王五,赵六,冯七总共20个人投票

递归:codevs 1251 括号

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 输

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 输入文件第

算法小练#1 - Dany Yang

开始记录每周做过的算法题,这是第一周,新的开始 1021. 删除最外层的括号 题目要求如下: 有效括号字符串为空 ("")."(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接.例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串. 如果有效字符串 S 非空,且不存在将其拆分为 S

3.12课程小练以及vim编辑器的基本用法(部分)

 课程小练 1. 通过man帮助手册,自行总结which.whereis.whatis命令的使用方法: which:展示出shell命令的完整路径: 格式: which [options] [--] programname [...] whereis:基于二进制的,有源的,和文件或命令的记录手册 格式:whereis [options] name... whatis:在 whatis 数据库里查找完整的单词 格式:whatis - 2. du命令: du - 报告磁盘空间使用情况 du -a,

递归小题中的空间换时间思想

题目: 如数: 1  1  2  3   5   8   13   21  34  55 ...... 序号: 0  1  2  3   4   5   6     7    8    9 ...... 由用户输入序号,输出对应的数值. 效果: 实现代码: #include <stdio.h> int bian(int num); //static int shu[100]={1,1}; int main() { int num; while ( printf("请输入编号数:&qu

随手练——几个递归小题目

递归最重要的两点: 1.base case(递归出口).必须有某些基本情形,它无需递归就能解出. 2.分解 或者 分类.分解成子问题,或者每层递归分叉,也就是一个N叉树模型.  例题: 打印一个字符串的所有子串 分解:按顺序每个字母是否打印,分解. base case: 当 pos==length,分解到了最后一步 void process(char *s,int pos,int length,string res) { if (pos == length) { cout << res <

shell中的括号(小括号,中括号,大括号)

一.小括号,园括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格. ②命令替换.等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令.有些shell不支持,如tcsh. ③用于初始化数组.如:array=(a b c d) 2.双小括号 ((  )

shell中的括号(小括号,大括号/花括号)

在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern) 现在分述如下: 1.Shell中变量的原形:${var} 大家常见的变量形式都是$va