一、问题描述
1.设给定n个变量x1,x2,…,xn。将这些变量依序作底和各层幂,可得n重幂如下
2.这里将上述n重幂看作是不确定的,当在其中加入适当的括号后,才能成为一个确定的n重幂。不同的加括号方式导致不同的n重幂。例如,当n=4时,全部4重幂有5个。
3.对n个变量计算出有多少个不同的n重幂。
4.输出n重幂的每种情况
二、问题分析及算法分析
1,利用分治的思想将原问题看成一个序列问题,序列顺序不变给序列加入适当的括号确定一个n重幂。
2,按分治的思想将原问题分解为原子问题,即先求一重幂。
3,通过a[i]=”(”+a[j]+a[i-j]+”)”的形式求第n重幂的情况,a[j]和a[i-j]是集合里面存着第j或i-j重幂的n种情况。
遍历a[n]输出n重幂的所有情况,a[n].size()即n重幂的情况数目。
代码
import java.util.ArrayList;
/**
* 描述 多重冪
* @author THTF
* @date 2018年7月9日
*/
public class MultiplePower {
private static StrList[] l; //下标表示第n重幂, .str是ArrayList数组用来存第n重幂的所有形式
public MultiplePower(int n) {
l = new StrList[n + 1]; //初始化
for (int i = 0; i < n + 1; i++) {
l[i] = new StrList(); //初始化
}
l[0].str.add(null); //0号下标不用
l[1].str.add("*"); //1重幂的时候不加括号
for (int i = 2; i <= n; i++) {
for (int j = 1; j < i; j++) {
for (String str2 : l[j].str) {
for (String str3 : l[i - j].str) {
l[i].str.add("(" + str2 + str3 + ")");
}
}
}
}
show(n);
}
/**
* 描述 输出所有n重幂
* @param n
*/
public static void show(int n) {
for (String i : l[n].str) {
StringBuilder sb = new StringBuilder(i);
int counter = 0;
for (int k = 0; k < i.length(); k++) {
if (sb.charAt(k) == '*') {
sb.setCharAt(k, (char) ('A' + counter++));
}
}
System.out.println(sb);
System.out.println("共"+l[n].str.size()+"种");
}
}
}
/**
*
* @author THTF
* @date 2018年7月9日
*/
class StrList {
public ArrayList<String> str;
public StrList() {
str = new ArrayList<String>(10000);
}
}