动态规划之最优二叉查找树

核心:
c n t ( i , j ) = s u m ( p [ k ] cnt(i,j)=sum(p[k] cnt(i,j)=sum(p[k] for k in range(i, j + 1) ) ) )
if i > j i>j i>j: d p [ i ] [ j ] = 0 dp[i][j]=0 dp[i][j]=0
else: d p [ j ] [ j ] = m a x ( d p [ i ] [ k ] + d p [ k + 2 ] [ j ] + c n t ( i , j ) dp[j][j]=max(dp[i][k]+dp[k+2][j]+cnt(i,j) dp[j][j]=max(dp[i][k]+dp[k+2][j]+cnt(i,j) for k in (i-1,j) ) ) )

class OptimalBinarySearchTree:
    def __init__(self, p):
        self.p = p
        self.dp = {}
        self.ans = {}

    def find(self, i, j):
        if (i, j) in self.dp:
            return self.dp[(i, j)]
        elif i > j:
            return int(0)
        else:
            self.dp[(i, j)] = int(1e9)
            cnt = sum(p[k] for k in range(i, j + 1))
            for k in range(i - 1, j):
                self.dp[(i, j)] = min(self.dp[(i, j)], self.find(i, k) + self.find(k + 2, j) + cnt)
            return self.dp[(i, j)]


if __name__ == '__main__':
    p = [0, 0.1, 0.2, 0.4, 0.3]
    s = OptimalBinarySearchTree(p)
    print(s.p)
    print(s.find(1, 4))
    for it in s.dp:
        print(it,":",s.dp[it])


在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值