1251 括号
Posted 神犇(shenben)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1251 括号相关的知识,希望对你有一定的参考价值。
题目描述 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; }
以上是关于1251 括号的主要内容,如果未能解决你的问题,请参考以下文章