前言
先来讲讲我是怎么用四天的时间来做这道题的吧。
第一天:看老师的课件,了解了思路,并得知了状态转移方程是如何得出的。
第二天:上网查题解,决定不用多叉树转二叉树,用自己的代码打出来。
第三天:真香,决定用多叉树转二叉树。
第四天:放弃直接动态规划,使用记忆化搜索。
这里简单阐述一下我为什么要用多叉树转二叉树与记忆化搜索。
第一,如果不用多叉树转二叉树,此题真的会变得非常复杂,不信的同学可以试试,绝对会让你感到绝望。
第二,我们都知道记忆化搜索与动态规划其实是互有关联的。我觉得此题适合用记忆化搜索的原因便是使用记忆化搜索,代码的实现难度会更低。为什么?
举一个简单的例子,假如我们在直接动态规划时往往需要考虑循环的顺序,这就会导致程序非常难以调试,并且在小范围的样例里查不出错来;而记忆化搜索却只需要调用一个函数。
尽管动态规划的时间复杂度肯定是比记忆化搜索低的,但毕竟做对题才是我们最终的目的。
扯了这么多,直接来看题吧!
题目
问题 I(1379): 【IOI2005】河流
时间限制: 1 Sec 内存限制: 64 MB
题目描述
几乎整个Byteland王国都被森林和河流所覆盖。小点的河汇聚到一起,形成了稍大点的河。就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海。这条大河的入海口处有一个村庄——名叫Bytetown
在Byteland国,有n个伐木的村庄,这些村庄都座落在河边。目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料。木料被砍下后,顺着河流而被运到Bytetown的伐木场。Byteland的国王决定,为了减少运输木料的费用,再额外地建造k个伐