【黑书】【DP】最优代价子母树

问题:有编号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]<min then 
					begin
						min:=f[i,k-1]+f[k+1,j];
						s[i,j]:=k;
					end;
				f[i,j]:=min+w[j]-w[i-1];
			end;
	writeln(fou,f[1,n]);
	close(fin); close(fou);
end.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值