#includeusing namespace std; struct TOBST { int r;//根节点 float e;//最优值、数学期望 float w;//从p[1]到p[i]的和 TOBST():r(0),e(0),w(0){} }; void result1(TOBST** t, int i, int j) { if (t[i][j].r == 0) return; result1(t, i, t[i][j].r - 1); cout << t[i][j].r; result1(t, t[i][j].r + 1, j); } void result2(TOBST** t,int i,int j) { if (t[i][j].r == 0) return; cout << t[i][j].r; result2(t, i, t[i][j].r - 1); result2(t, t[i][j].r + 1, j); } void result3(TOBST** t, int i, int j) { if (t[i][j].r == 0) return; result3(t, i, t[i][j].r - 1); result3(t, t[i][j].r + 1, j); cout << t[i][j].r; } int main() { //给n赋值 int n = 4; //给p[1]-p[n]赋值 float* p = new float [n + 1]; for (int i = 1; i <= n; i++) { p[i] = 0.25;//假设四个都是等概率 } //建立表格 TOBST** t = new TOBST* [n + 2]; //多建了第n+1行是为了,当rr=j且j==n时, //ee=… + t[rr + 1][j].e +…不出错,此时rr+1=n+1,若不多建第n+1行,则会溢出 for (int i = 1; i <= n+1; i++) { t[i] = new TOBST [n + 1]; } //事先给w赋值 for (int i = 1; i <= n; i++) { float ww = 0; for (int j = i; j <= n; j++) { ww += p[j]; t[i][j].w = ww; } } //主对角线 for (int i = 1; i <= n; i++) { t[i][i].r = i; t[i][i].e = p[i]; } //用l代表含结点的个数 for (int l = 2; l <= n; l++) { for (int i = 1; i + l - 1 <= n; i++) { int j = i + l - 1; //需要求t[i][j] //t[i][j].e=min(t[i][r-1].e+t[r+1][j].e+t[i][j].w)//i<=r<=j float e = t[i][i - 1].e + t[i + 1][j].e + t[i][j].w; int r = i; //从i+1开始遍历r,求不同r对应的e,比较得更小,再更新 for (int rr = i + 1; rr <= j; rr++) { float ee = t[i][rr - 1].e + t[rr + 1][j].e + t[i][j].w; if (ee < e) { r = rr; e = ee; } } t[i][j].r = r; t[i][j].e = e; } } //打印出整张表 for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { cout <<"t["<



