博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【黑书】【DP】最优代价子母树
阅读量:5220 次
发布时间:2019-06-14

本文共 906 字,大约阅读时间需要 3 分钟。

问题:有编号1-n的节点,以编号为权值建立BST,定义代价为Σf[i]*d[i],其中f[i]为i节点的权值,d[i]为i在BST上的深度。求所有BST中最小的代价。

 

解决:动态规划问题。动态转移方程为:

                F[i,j]=min(f[i,k-1],f[k+1,j])+w[i,j]  (i<=k<=j)

其中w[i,j]=Σf[k](i<=k<=j)

时间复杂度为O(n^3)

四边形不等式优化(重点)

证明过程略

总之设s[i,j]为区间(i,j)的决策k,则s[i,j-1]<=k<=s[i+1,j]

则时间复杂度降为O(n^2)

Code:

Program MinBST;var	f,s			:		array[1..100,1..100] of longint;	cost,w		:		array[1..100] of longint;	n,i,j,k,l	:		longint;	beg,en,min	:		longint;	fin,fou		:		text;	begin	assign(fin,'minbst.in');	assign(fou,'minbst.out');	reset(fin); rewrite(fou);	readln(fin,n);	for i:=1 to n do 		begin			readln(fin,cost[i]);			w[i]:=w[i-1]+cost[i];		end;	for i:=1 to n do 		begin			f[i,i]:=cost[i];			s[i,i]:=i;		end;			for l:=2 to n do 		for i:=1 to n-l+1 do 			begin				j:=i+l-1;				beg:=s[i,j-1];				en:=s[i+1,j];				min:=maxlongint;				for k:=beg to en do						if f[i,k-1]+f[k+1,j]

转载于:https://www.cnblogs.com/Lr-bob/archive/2012/02/20/2360617.html

你可能感兴趣的文章
discuz 常用脚本格式化数据
查看>>
MS CRM 2011 创建基于Fetch的报表 -- 进阶版
查看>>
zabbix 监控zookeeper
查看>>
trace与代码跟踪服务
查看>>
Fire!
查看>>
洛谷P2777
查看>>
Ajax
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
android开发学习笔记:圆角的Button
查看>>
Activity简介
查看>>
jqGrid树
查看>>
循环-12. 打印九九口诀表(15)
查看>>
oracle树状索引详解(图摘取《收获不止oracle》)
查看>>
Android Studio 设置代码提示和代码自动补全快捷键--Eclipse 风格 - 转
查看>>
ORACLE基本操作备忘
查看>>
Maven学习:项目之间的关系
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
makefile中使用变量
查看>>
GIT笔记:将项目发布到码云
查看>>