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

UVA - 10304 Optimal Binary Search Tree 区间DP

2014-12-19 09:57 411 查看
题目大意:有一棵二叉树,二叉树的最终值 = sum ( 节点的值 * (所在高度- 1) ),这是一棵搜索二叉树,所以左子树的所有节点的值是小于等于根节点,右子树的所有节点的值是大于等于根结点的,求这个二叉树的最终值的最小值

解题思路:刚开始不知道怎么求值,参考了Staginner大神的解析才懂得了,dp[i][j] = dp[i][k-1] + dp[k+1][j] + sum[j] - sum[i-1] -num[k], num[k]是第k个数的值,sum[j]表示的是第1个数到第j个数的和,dp[i][j]表示的是从第i个数到第j个数形成一棵树的状态下的最优值,从i到j中挑选一个节点k当成根节点,左右子树的最优值就是dp[i][k-1]和dp[k+1][j],sum[j] - sum[i-1] - num[k]就表示将i到j的所有节点的值(排除了第k个)的和乘上2,就等同于从第i个到第j个除了第k个外所有的节点的高度都加上了1

#include<cstdio>
#include<cstring>
#define maxn 255
#define INF 0x3f3f3f3f
int num[maxn],dp[maxn][maxn],sum[maxn];
int N;
int main() {
	while(scanf("%d",&N) != EOF) {
		sum[0] = 0;
		for(int i = 1; i <= N; i++) {
			scanf("%d",&num[i]);
			sum[i] = sum[i-1] + num[i];
		}

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