- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
男人要过的8题教学幻灯片.ppt
是男人就过8题
方法二
记F[N]就是答案,G[N]是2^(N*(N-1)/2)-F[N];
我们这么计算G[N]。枚举和第一个点连通的有多少个点,余下的点任意。
所以Sum{C(i-1,N-1)*F[i]*2^((N-j)*(N-j-1)/2),i=1…N-1}
O(N^2*高精)
An old Stone Game
经典的石子合并问题 每次合并代价为两堆石子数的和 求总代价的最小值
单纯贪心的反例:5 3 4 5
方法一
圆方贪心
开始认为是N个圆。
每次合并两个和最小的且中间没有圆形物品的物品,变成一个方的物品。
合并所有相邻的方。
全局用Winner Tree取最小(Winner Tree的相关内容可以看黄劲松的论文)
合并相邻方所采用的数据结构
(1)fib堆 O(NLogN) (可以参考龙凡的ppt)
(2)二项堆 O(NLogN)
(3)左偏树 O(NLogN) (可以参考黄源河的ppt)
(4)普通堆+启发式合并 O(N(LogN)^2)
比较
编程复杂度(1)(2)(3)(4)
运行速度(不包括(1))
(3)(2)(4)
方法二
Knuth的方法
从左往右扫描,第一次遇到a, b, c且a b, c a,则将a, b合并
Tonys Tour
求从左下走到右下角的哈密尔顿路的数量
与HNOI04-Day1的一道题目相似
搜索很难通过,只能DP
TimGreen大牛的解法
状态压缩的Dp。
状态是一行(或一列) 的连通性(用最小表示)。
如010122表示第2个和第4连通了,第5个和第6个连通了。第1个和第3个没有向下走。
每个点的走法有6种(─│ ┐┌ └ ┘)
然后一行行Dp下去(Search每个点的走法,有些烦)。
中间因为不是所有的状态都是合法的,所以每一层的状态数不是很多。
再一点要注意的是最后一行 起点和终点上都只能是(─│) 连通性只能是10..001
A New Stone Game
开始给出N堆石子,每一次可以选一堆石子取走至少一个,然后可以任意的将这一堆余下的任意多个分配到其它堆里。问两个人都使用最优策略的情况下, 是不是先手胜。
结论
会输只有一种情况“N是偶数且每个数出现偶数次”
证明方法
证明有点繁,大致是这样。
定义上面所说的输的状态全部属于T。
定义所有不属于T的状态属于S。
首先先证明对于T中一个状态执行一步后一定会属于S。
再证明对于S中的每一个状态一定有一种方法可以使它转移到T中。
最后注意到全空这个输的状态属于T。
O(1)
Tree
求一棵树中距离不超过给定值的点对数
对于一个树,去掉一个结点,最分散的每颗子树分别求解,然后用O(NLogN)的方法合并结果。
一般排序 O(N(LogN)2)
基数排序 O(NLogN)
Coins
给出N种硬币和个数,问可以取到1-M中的多少个值。
经典的01背包 复杂度O(NMC) 超时!
下面介绍来自Lee.MaRS大牛笔记的两种可以AC的方法
方法一
将1...ci的coin看面1,2,4,..2x,ci-(2x+1-1)的组合。
例如15个1与1 2 4 8是等价的
复杂度降为O(NMlogC)
将多个bool压成int(Pascal 32个bool压成longint,C++ 直接使用bitset)
方法二
剩余类优化的动态规划算法
状态仍然是F[i,j]表示用前i种钱币是否能拼出面值j。考虑在计算第i阶段时,面值为d[i],数量为n[i]。从状态转移方程中,我们发现F[i,j]所依赖的所有状态,都属于模d[i]的一个剩余类[j mod d[i]],即不同剩余类内的状态不相互影响。于是,我们可以将第i个阶段的状态按剩余类划分,每次只对一个剩余类的状态进行更新。
复杂度O(NM)
Musical Theme
给出一个数列,将数列相邻两项做差,形成新数列,求数列中的最长重复子串(不可相交)
方法一
后缀数组+二分答案(后缀数组相关内容可以看许智磊的论文)
假如二分得到答案L,如何知道它是可行的呢?
因为对于排序后的后缀,Lcp ( Suffix ( List [ i ] ) , Suffix ( List [ i - 1 ] ) )
是所有与Suffix ( List [ i ] )的LCP值中最大的一个。
因为 Height [ i ] 表示的是排序后后缀数组中第i个后缀和第i-1个后缀的LCP值。
那么对于后缀数组中的一段 L - R , 若 Height [ L + 1 ] ~ Height [ R ] 全部大于等于L,那么就等价于第L到第R个后缀中任意两个后缀的LCP值都大于等于L。
那么只要取这里面相隔最远的两个后缀,若他们相距大于L,那么就是可行的。
( 为什么不是等于L呢 ? 因为我们取的关
原创力文档


文档评论(0)