Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45658
  • 博文数量: 25
  • 博客积分: 1160
  • 博客等级: 少尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-30 09:14
文章分类
文章存档

2009年(1)

2008年(24)

我的朋友
最近访客

分类: C/C++

2008-05-13 20:24:06

NOI2002上第一试的第三题

贪吃九头龙

题目描述:

暂略

题目分析:

首先我们考虑对其它小头的处理,我们发现对于m>3,当大头把该吃的吃完后,其他的头可以毫不费难受度将果子吃完,对于一个树枝,可以一个小头吃一端的果子,另一小头吃另一端的果子。

于是问题转换为将以i为根的树大头吃k个的最小难受度,由于是多叉树,我们首先考虑将它转换为更好处理的二叉树,于是我们又以下方程:

f[i,j,k]=min{ f[x1,j1,1]+f[x2,j-j1-1,k]+d[k,1]*cost[i,father[i]]——i给小的吃

f[x1,j1,0]+f[x2,j-j1,k]+d[k,0]*cost[i,father[i]]——i给大的吃}

d[i,j]=1 i=1andj=1

     1 i=0andj=0andm=2

     0 else

其中f[0,0,k]=0f[o,j,k]=max j>0

实现时我们选用记忆化搜索的方式,以避免许多不必要的问题计算,问题至此就解决了。

题目总结:

这一题的关键在于对小头的转换,其他的只是一些顺理成章的问题。

注:这个是看算法艺术与信息学竞赛书写的,我自己还有另外一个想法,就是可以用邻接表做此题(也有可能就是线段树,目前我还不怎么明白线段树,所以不确定是个啥),就是把所有结点存在顶点表里,然后每个结点又有一个边表,把其所有直接子节点依次存里面(参考),及把某结点的所有直接子节点转换成线性的,然后用类似的方法做,要哪位大虾能明白或是有别的想法,请一定要留个贴哈,先在此谢谢啦。
阅读(569) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

henghengheng2008-05-13 22:26:24

什么时候适合应用哈希表呢?如果发现解决这个问题时经常要询问:"某个元素是否在已知集合中?",也就是需要高效的数据存储和查找,则使用哈希表是最好不过的了!那么,在应用哈希表的过程中应注意,就是较低的冲突率和易于实现

henghengheng2008-05-13 22:20:49

当用hash表时,通常使它的容量至少是题目最大需求的 120% ,效果比较好(这个仅仅是经验,没有严格证明)。