写出最优二叉搜索树的自底向上非递归的动态规划算法。
输入: 首先输入 结点的个数 n , 再依次输入 搜索成功的概率 bi , 最后依次输入 搜
索失败的概率 aj。 。 注意: 所有值都不能随机生成 , 且只输入整数 (概率×100) ) ! ! ! !
输出: 最优二叉树的结构。
示例: 输入:5 15 10 5 10 20 5 10 5 5 5 10 , 输出:
S2 是根
S2 的左孩子是S1
S2 的右孩子是S5
S5 是根
S5 的左孩子是S4
S4 是根
S4 的左孩子是 S3
//这个和矩阵连乘有很大的相似情况
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int s[][]=new int [n+2][n+1];
int w[][]=new int [n+2][n+1];
int m[][]=new int [n+2][n+1];
int p[]=new int [n+1];
int q[]=new int [n+1];
for (int i = 1; i <=n; i++) {
p[i]=scan.nextInt();
}
for (int i = 0; i <=n; i++) {
q[i]=scan.nextInt();
}
aaa(s, w, m, p, q, n);
bbb(s, 1, n);
}
public static void aaa(int s[][],int w[][],int m[][],int p[],int q[],int n) {
for (int i = 0; i <=n; i++) {
w[i+1][i]=q[i];
m[i+1][i]=q[i];
}
for (int r = 0; r < n; r++) {
for (int i = 1; i <=n-r; i++) {
int j =i+r;
w[i][j]=w[i][j-1]+p[j]+q[j];
m[i][j]=m[i][i-1]+m[i+1][j];
s[i][j]=i;
for (int k = i+1; k <=j; k++) {
int t=m[i][k-1]+m[k+1][j];
if (t<m[i][j]) {
m[i][j]=t;
s[i][j]=k;
}
}
m[i][j]+=w[i][j];
}
}
}
public static void bbb(int s[][],int i,int j) {
if (i<j) {
int root=s[i][j];
System.out.println("S"+root+"是根");
if (s[i][root-1]>0) {
System.out.println("S"+root+"的左孩子是S"+s[i][root-1]);
}
if (s[root+1][j]>0) {
System.out.println("S"+root+"的左孩子是S"+s[root+1][j]);
}
bbb(s, i, root-1);
bbb(s, root+1, j);
}
}