uva 10304 Optimal Binary Search Tree (区间DP)

来源:互联网 发布:udp源端口号 编辑:程序博客网 时间:2024/06/05 14:31

uva 10304 Optimal Binary Search Tree

题目大意:给出N个结点(已知每个结点的权值)来建树,建树时要满足以下规则:左子树的节点的值要全小于父节点,右子树的节点的值要全大于父节点。要求最后建出的树总权值最小。总权值=各结点乘以层数(从0层开始)之后相加的和。

解题思路:dp[i][j]代表区间第i个结点到第j个结点组成的树最小的总权值。dp[j][i]=min(dp[j][i],dp[j][k1]+dp[k+1][i]+sum[i]sum[j1]num[k])

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;typedef long long ll;int main() {    return 0;}#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>#define N 300using namespace std;typedef long long ll;int num[N];int dp[N][N], sum[N];int main() {    int n;    while (scanf("%d", &n) == 1) {        sum[0] = 0;        for (int i = 1; i <= n; i++) {            scanf("%d", &num[i]);            sum[i] = sum[i - 1] + num[i];           }        memset(dp, 0, sizeof(dp));        for (int i = 2; i <= n; i++) {            for (int j = i - 1; j > 0; j--) {                dp[j][i] = 0xFFFFFFF;                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] - num[k]);                  }            }        }        printf("%d\n", dp[1][n]);    }    return 0;}
0 0
原创粉丝点击