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

来源:互联网 发布:英文说明书翻译软件 编辑:程序博客网 时间:2024/05/18 04:53

题意:

建一棵树,左子树小于根小于右子数,现要求求出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][n]);}return 0;}



0 0
原创粉丝点击