C++剑指offer:树形DP——河流(riv):较复杂的树形DP 应用多叉树转二叉树的方法

本文介绍了如何使用C++解决IOI2005年的河流问题,涉及树形动态规划(DP)和多叉树转二叉树的方法。通过四天的学习和尝试,作者最终采用记忆化搜索来降低代码实现难度。题目要求在最小化运费的前提下,决定在哪些村庄建立额外的伐木场。文章提供了问题描述、输入输出格式,并讨论了状态转移方程和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

先来讲讲我是怎么用四天的时间来做这道题的吧。

第一天:看老师的课件,了解了思路,并得知了状态转移方程是如何得出的。

第二天:上网查题解,决定不用多叉树转二叉树,用自己的代码打出来。

第三天:真香,决定用多叉树转二叉树。

第四天:放弃直接动态规划,使用记忆化搜索。

这里简单阐述一下我为什么要用多叉树转二叉树与记忆化搜索。

第一,如果不用多叉树转二叉树,此题真的会变得非常复杂,不信的同学可以试试,绝对会让你感到绝望。

第二,我们都知道记忆化搜索与动态规划其实是互有关联的。我觉得此题适合用记忆化搜索的原因便是使用记忆化搜索,代码的实现难度会更低。为什么?

举一个简单的例子,假如我们在直接动态规划时往往需要考虑循环的顺序,这就会导致程序非常难以调试,并且在小范围的样例里查不出错来;而记忆化搜索却只需要调用一个函数。

尽管动态规划的时间复杂度肯定是比记忆化搜索低的,但毕竟做对题才是我们最终的目的。

扯了这么多,直接来看题吧!

题目

问题 I(1379): 【IOI2005】河流

时间限制: 1 Sec  内存限制: 64 MB

题目描述

几乎整个Byteland王国都被森林和河流所覆盖。小点的河汇聚到一起,形成了稍大点的河。就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海。这条大河的入海口处有一个村庄——名叫Bytetown

在Byteland国,有n个伐木的村庄,这些村庄都座落在河边。目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料。木料被砍下后,顺着河流而被运到Bytetown的伐木场。Byteland的国王决定,为了减少运输木料的费用,再额外地建造k个伐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值