面相对象的topSort和递推【ural1022/ural1017】
2011-05-28 17:37
267 查看
面向对象是个好东西,他可以使责任分立,于是我尝试着在ural1022里面使用了这个思想来实现拓扑排序,很幸运的一次AC。
以节点为对象,他的责任有:
1 操作自身划入另一个集合
2 操作子节点入度减一
3 通知入度为0的子节点执行上述两个操作
面向对象的好处除了责任分立之外,还有数据的独立。节点对象存储了自身入度,出度,孩子节点等信息。不得不说在思路上比面向过程的要清晰,易书写也易维护。
ural1017好多人说是DP,我却用递推把他解了出来。。说实话,DP和递推的界限不是很明显,我甚至觉得DP是用递推实现的记忆化搜索。网上的DP是O(n^2)的时间复杂度。递推是O(n^3)。
递推式为:f[i,j] = sum{f[i-j,k]}(k = 0..min(i-j,j-1))
自底向上的递推。
其实这个式子还是有优化的余地的,比如k的下界,可用(l(l+1)/2 = i-j)计算出l,l便是下界。
l约等于sqrt(2*(i-j)),取l为sqrt(i-j),这样一来又可以提升一些效率,只不过这个朴素的算法没有超时,也便不再添加不必要的优化。
这个题有个悲剧的地方就是有两次WA test6和一次stack crash。
wa test6是因为接收答案的变量范围定义的太小了
stack crash是由于改大变量后堆栈溢出。数组放到main里面会出现这个状况,但是写到main外面就不会。
原因是函数内分配的变量会放到栈区(main也不能免俗),栈区大小一般是2M。而全局区却很大(有人说是4G)
相关文章推荐
- 递推DP URAL 1017 Staircases
- URAL 1017. Staircases(递推)
- 【面相对象】静态代码块、构造代码块和构造函数的执行顺序
- javascript面相对象编程
- Object-C 学习笔记(九)---面相对象(多态)
- ural 1022 Genealogical Tree
- C++面相对象三大特性
- JavaScript 构造函数 面相对象学习必备知识
- ural 1017. Staircases DP
- URAL 1309 Dispute <函数关系的递推>
- (转)AS3 面相对象 高级话题
- 浅谈面相对象思想
- URAL:1017 Staircases
- Ural 1017
- URAL 1225(Flags)简单递推
- 函数式编程与面相对象
- GUI编程学习第一弹:《计算器》。尽量面相对象,但依然不给力。仍旧全文注释,大家一起勉励
- 6-1 java中的面相对象;使用包管理java中的类;java中的访问修饰符;java中的this关键字
- ural1017 Staircases (动态规划)
- c# 面相对象2-之封装性