Skip to content

Commit 3019d27

Browse files
committed
optimal BST
1 parent 000ce9a commit 3019d27

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// https://www.youtube.com/watch?v=HnslzEs8dbY&ab_channel=Pepcoding
2+
// Given sorted nodes of BST
3+
// and their search frequency
4+
// find the minimum BST which has minimum seach cost.
5+
// FIND MIN COST
6+
7+
int optimalBST(vector<int> arr, vector<int> freq) {
8+
int n = arr.size();
9+
vector<vector<int>> dp(n, vector<int>(n, 0));
10+
vector<int> cum_freq(n, 0);
11+
cum_freq[0] = freq[0];
12+
for (int i = 1; i < n; i++) {
13+
cum_freq[i] = cum_freq[i - 1] + freq[i];
14+
}
15+
for (int gap = 0; gap < n; gap++) {
16+
for (int i = 0, j = gap; j < n; i++, j++) {
17+
if (gap == 0) {
18+
dp[i][j] = freq[i];
19+
// } else if (gap == 1) {
20+
// dp[i][j] = min(freq[i] + 2 * freq[j], 2 * freq[i] + freq[j]);
21+
} else {
22+
int min_cost = INT_MAX;
23+
int height_inc_cost = cum_freq[j] - ((i == 0) ? 0 : cum_freq[i - 1]);
24+
for (int k = i; k <= j; k++) {
25+
int left = (k == i) ? 0 : dp[i][k - 1]; // extreme left overflow
26+
int right = (k == j) ? 0 : dp[k + 1][j]; // extreme right overflow
27+
min_cost = min(min_cost, height_inc_cost + left + right);
28+
}
29+
dp[i][j] = min_cost;
30+
}
31+
}
32+
}
33+
return dp[0][n - 1];
34+
}

0 commit comments

Comments
 (0)