面相对象的topSort和递推【ural1022/ural1017】

面相对象的topSort和递推【ural1022/ural1017】

面相对象的topSort和递推【ural1022/ural1017】

面向对象是个好东西,他可以使责任分立,于是我尝试着在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)
posted @ 2011-05-28 17:37  dk647  阅读(229)  评论(0编辑  收藏  举报