您的位置:首页 > 运维架构

uva 10304 - Optimal Binary Search Tree(区间dp)

2016-04-18 19:48 519 查看
题意:

建一棵树,左子树小于根小于右子数,现要求求出f1*h1+f2*h2+...的最小(f是权值,h是高度)

那么用区间dp,枚举i到j以k为根的最小总数

那么每增加一层(除了根),就会增加sum:i->j并且减去a[k];

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 260;
const int INF = 1<<30;
int n;
int a[maxn];
int sum[maxn];
int dp[maxn][maxn];
int main() {

while(scanf("%d", &n) == 1) {
sum[0] = 0;
for(int i=1; i<=n; i++) {
scanf("%d", &a[i]);
sum[i] = sum[i-1]+a[i];
}
memset(dp, 0, sizeof(dp));
for(int i=2; i<=n; i++)
for(int j=i-1; j; j--) {
dp[j][i] = INF;
for(int k=j; k<=i; k++) {
dp[j][i] = min(dp[j][i], dp[j][k-1]+dp[k+1][i]+sum[i]-sum[j-1]-a[k]);
}
}
printf("%d\n", dp[1]
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: