最優二叉搜索樹自底向上非遞歸的動態規劃算法

寫出最優二叉搜索樹的自底向上非遞歸的動態規劃算法。
輸入: 首先輸入 結點的個數 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);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章