男人八题其二(POJ 1738) 石子合并 GarsiaWachs算法

来源:互联网 发布:java反射机制的优缺点 编辑:程序博客网 时间:2024/05/22 03:29

楼天城楼教主:男人八题:POJ 1737 - POJ 1744

男人八题其二: POJ 1738 石子合并

石子合并的核心算法是DP,但是最有效率的还是GarsiaWachs算法,这种算法的核心思路如下:

设序列是stone[],从左往右,找一个满足stone[k-1] <= stone[k+1]k,找到后合并stone[k]stone[k-1],再从当前位置开始向左找最大的j,使其满足stone[j] > stone[k]+stone[k-1],插到j的后面就行。一直重复,直到只剩下一堆石子就可以了。在这个过程中,可以假设stone[-1]stone[n]是正无穷的。


根据这个思路可以很简单的做出一道石子合并的题目(NYOJ 737)

题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=737

AC代码: https://github.com/Kiritow/OJ-Problems-Source/blob/master/NYOJ/737.cpp


但是这道题数据量很大(N~50000),纯DP无法使用二维数组,而刚才的那套方法使用的STL vector不说,还有很多没有意义的数据移动(vector这种连续性容器使用erase和insert的代价可能是巨大的)。因此需要在移动过程中进行判断,同时调整合并起点以及操作点来避免重复的无意义移动。网上的代码研究了很长时间,自己添加了一些注释方便理解。

题目链接: http://poj.org/problem?id=1738

AC代码:https://github.com/Kiritow/OJ-Problems-Source/blob/master/POJ/1738.cpp

1 0
原创粉丝点击