最优二叉搜索树,根据二叉搜索树的性质,左子树的元素 < root < 右子树的元素
1.设cost[i][j] 表示从第i个结点到第j个结点的频率和
2.设min_cost[i,l,r] 表示以第l个结点到第r个结点的最优二叉搜索树的理想值,其中root = i
3.设dp[i][j] 表示区间为[i,j]结点组成的二叉搜索树的min_cost
4.min_cost[i,l,r] = min_cost[l,i-1]+cost[l,i-1]+min_cost[i+1,r]+cost[i+1,r]
5.dp[i][j] = min{min_cost[i,l,r]}
6.ans = dp[1][n]
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 256
#define INF 0x7fffffff
int dp[MAXN][MAXN], cost[MAXN][MAXN], val[MAXN];
int min_bst(const int &l, const int &r)
{
int rst(INF);
if( l >= r ) {
return 0;
}
for(int i = l; i <= r; i ++) {
dp[l][i-1] = (-1 == dp[l][i-1])? min_bst(l, i-1) : dp[l][i-1];
dp[i+1][r] = (-1 == dp[i+1][r])? min_bst(i+1, r) : dp[i+1][r];
rst = min(rst, dp[l][i-1]+((l > i-1)? 0 : cost[l][i-1])+dp[i+1][r]+cost[i+1][r]);
}
return dp[l][r] = rst;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int n;
while( ~scanf("%d", &n) ) {
for(int i = 0; i < n; i ++) {
scanf("%d", &val[i]);
}
memset(dp, -1, sizeof(dp)); memset(cost, 0, sizeof(cost));
for(int i = 0; i < n; i ++) {
for(int j = i, sum = 0; j < n; j ++, sum = 0) {
for(int k = i; k <= j; k ++) {
sum += val[k];
}
cost[i][j] = sum;
}
}
printf("%d\n", min_bst(0, n-1));
}
return 0;
}
uva_10304 - Optimal Binary Search Tree(最优搜索二叉树)
最新推荐文章于 2024-04-30 16:26:01 发布