分类: 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]=0,f[o,j,k]=max j>0
实现时我们选用记忆化搜索的方式,以避免许多不必要的问题计算,问题至此就解决了。
题目总结:
这一题的关键在于对小头的转换,其他的只是一些顺理成章的问题。
henghengheng2008-05-13 22:26:24
什么时候适合应用哈希表呢?如果发现解决这个问题时经常要询问:"某个元素是否在已知集合中?",也就是需要高效的数据存储和查找,则使用哈希表是最好不过的了!那么,在应用哈希表的过程中应注意,就是较低的冲突率和易于实现