#include <vector>
#include <iostream>
#include <limits.h>
using namespace std;
int sum(vector<int> freq, int i, int j) {
int s = 0;
for (int x = i; x <= j; x++) {
s += freq[x];
}
return s;
}
int optimalSearchTree(vector<int> keys, vector<int> freq) {
int n = keys.size();
vector<vector<int>> cost(n, vector<int>(n, 0));
for (int i = 0; i < n; i++) {
cost[i][i] = keys[i];
}
for (int L = 2; L <= n; L++) {
for (int i = 0; i <= n - L + 1; i++) {
int j = i + L - 1;
cost.at(i).at(j) = INT_MAX;
for (int r = i; r <= j; r++) {
int c = ((r > i) ? cost[i][r - 1] : 0) +
((r < j) ? cost[r + 1][j] : 0) +
sum(freq, i, j);
if (c < cost[i][j]) {
cost[i][j] = c;
}
}
}
}
return cost[0][n - 1];
}
int main() {
vector<int> keys = { 10,12,16,21 };
vector<int> freq = { 4,2,6,3 };
cout << optimalSearchTree(keys, freq) << endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IHN1bSh2ZWN0b3I8aW50PiBmcmVxLCBpbnQgaSwgaW50IGopIHsKCglpbnQgcyA9IDA7Cglmb3IgKGludCB4ID0gaTsgeCA8PSBqOyB4KyspIHsKCQlzICs9IGZyZXFbeF07Cgl9CgoJcmV0dXJuIHM7Cn0KCmludCBvcHRpbWFsU2VhcmNoVHJlZSh2ZWN0b3I8aW50PiBrZXlzLCB2ZWN0b3I8aW50PiBmcmVxKSB7CgoKCWludCBuID0ga2V5cy5zaXplKCk7Cgl2ZWN0b3I8dmVjdG9yPGludD4+IGNvc3QobiwgdmVjdG9yPGludD4obiwgMCkpOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJY29zdFtpXVtpXSA9IGtleXNbaV07Cgl9CgoJZm9yIChpbnQgTCA9IDI7IEwgPD0gbjsgTCsrKSB7CgoJCWZvciAoaW50IGkgPSAwOyBpIDw9IG4gLSBMICsgMTsgaSsrKSB7CgoJCQlpbnQgaiA9IGkgKyBMIC0gMTsKCQkJY29zdC5hdChpKS5hdChqKSA9IElOVF9NQVg7CgoJCQlmb3IgKGludCByID0gaTsgciA8PSBqOyByKyspIHsKCgoJCQkJaW50IGMgPSAoKHIgPiBpKSA/IGNvc3RbaV1bciAtIDFdIDogMCkgKwoJCQkJCSgociA8IGopID8gY29zdFtyICsgMV1bal0gOiAwKSArCgkJCQkJc3VtKGZyZXEsIGksIGopOwoKCQkJCWlmIChjIDwgY29zdFtpXVtqXSkgewoJCQkJCWNvc3RbaV1bal0gPSBjOwoJCQkJfQoKCQkJfQoJCX0KCX0KCglyZXR1cm4gY29zdFswXVtuIC0gMV07Cn0KCgppbnQgbWFpbigpIHsKCgl2ZWN0b3I8aW50PiBrZXlzID0geyAxMCwxMiwxNiwyMSB9OwoJdmVjdG9yPGludD4gZnJlcSA9IHsgNCwyLDYsMyB9OwoKCWNvdXQgPDwgb3B0aW1hbFNlYXJjaFRyZWUoa2V5cywgZnJlcSkgPDwgZW5kbDsKCn0KCgo=