- 1、本文档共67页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
枚举、模拟、贪心;智力题;枚举法;虽然枚举法本质上属于搜索策略,但是它与回溯法有所不同。因为适用枚举法求解的问题必须满足两个条件:
??????⑴可预先确定每个状态的元素个数n;
⑵状态元素a1,a2,…,an的可能值为一个连续的值域。
设
ai1—状态元素ai的最小值;aik—状态元素ai的最大值(1≤i≤n),即a11≤a1≤a1k,a21≤a2≤a2k,ai1≤ai≤aik,……,an1≤an≤ank
fora1←a11toa1kdo
foa2←a21toa2kdo……
forai←ai1toaikdo……
foran←an1toankdo
if状态(a1,…,ai,…,an)满足检验条件
then输出问题的解;
;枚举法的优点:
⑴由于枚举算法一般是现实生活中问题的“直译”,因此比较直观,易于理解;
⑵由于枚举算法建立在考察大量状态、甚至是穷举所有状态的根底上,所以算法的正确性比较容易证明。
枚举法的缺点:
枚举算法的效率取决于枚举状态的数量以及单个状态枚举的代价,因此效率比较低。;例如;巧妙填数;二、枚举算法的优化
枚举算法的时间复杂度可以用状态总数*考察单个状态的耗时来表示,因此优化主要是
⑴减少状态总数〔即减少枚举变量和枚举变量的值域〕
⑵降低单个状态的考察代价
优化过程从几个方面考虑。具体讲
⑴提取有效信息
⑵减少重复计算
⑶将原问题化为更小的问题
⑷根据问题的性质进行截枝
⑸引进其他算法;时钟问题;时钟问题;分析;建立时钟控制表;设计算法;优化;结果;找数字;分析;优化;装箱子;硬币;模拟;LED;读数练习;等价表达式;五魔方;;;;;;贪心;;合并果子;repair建筑抢修;;方法一;方法二;证明;搬桌子;;;;Desk.in;算法讲解;;列车;AGamewithBalls;;;最小生成树prim算法贪心证明;;加油问题;;思路;证明;分治;分治--分而治之
把一个复杂的问题分成两个或更多的相同或相似的子问题
再把子问题分成更小的子问题……
直到最后子问题可以简单的直接求解
原问题的解即子问题的解的合并。;排序算法
快速排序
归并排序
;求A*A=B;给定矩阵A,求A+A^2+A^3+...+A^k的结果〔两个矩阵相加就是对应位置分别相加〕。输出的数据modm。k=10^9。;A^i可以???分求出;对整个题目的数据k进行二分即可
比方,当k=6时,有:
????A+A^2+A^3+A^4+A^5+A^6
=(A+A^2+A^3)+A^3*(A+A^2+A^3)
???
只需求出A^3后再递归地计算A+A^2+A^3,即可得到原问题的答案。;对于一个包含N个非负整数的数组A[1..n],如果有ij,且A[i]A[j],那么称(A[i],A[j])为数组A中的一个逆序对。
例如,数组〔3,1,4,5,2〕的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。;最原始的方法,利用两重循环进行枚举。该算法的时间复杂度为O(n^2)。
;利用归并排序的思想求解逆序对的个数,该算法的时间复杂度为O(nlogn)。
分治?;将序列A一分而二,分为两个序列B和C
如果求出了B和C序列的逆序对数,那么怎么计算A的序列的逆序对数
在递归求解B和C两个序列的逆序对个数以后,对B和C两个序列进行排序后,统计两个序列之间的逆序对个数十分容易
B:6542
C:6322
B中的654与C中的3、2和2产生逆序对;通过这样的方法可以很容易的求出序列中的逆序对数
文档评论(0)