分治算法简介及习题选讲..ppt

  1. 1、本文档共46页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
例6:逆序对 给一列数a1,a2,...,an,求它的逆序对数,即有多少个有序对(i,j),使得ij且aiaj。n可以高达106。 方法一 枚举i,j判断a[i]a[j]是否成立。程序如下: ans:=0; for i:=1 to n-1 do for j:=i+1 to n do if a[i]a[j] then inc(ans); writeln(ans); 时间复杂度为O(n2),超时。 方法二 从大到小枚举i,再用树状数组维护ai+1到an中有多少个数小于ai。 时间复杂度O(nlgn)。 方法三 分治法。 f[i,j]表示a[i..j]中逆序对的个数。利用类似于归并排序的方法分以下三个步骤来做: 1.划分问题:从中间一分为二分成[i,(i+j)shr 1]和[(i+j)shr 1+1,j]两部分; 2.递归解决:递归求解f[i,(i+j)shr 1]和f[(i+j)shr 1+1,j]; 3.合并问题:f[i,j]=f[i,(i+j)shr 1]+f[(i+j)shr 1+1,j],除此之外,还要加上左数在区间[i,(i+j)shr 1]内而右数在区间[(i+j)shr 1+1,j]内的情况,可以在归并排序的合并操作中顺便进行,对于合并区域[L1,R1]和[L2,R2],当判断到左区域中的a[x](L1=x=R1)大于右区域中的a[y](L2=y=R2)时,说明a[x..R1]都是大于a[y]的,此时逆序对增加R1-x+1。 时间复杂度与归并排序一样都是O(nlgn)。 f[i,(i+j)shr 1] f[(i+j)shr 1+1,j] f[i,j] x y 方法三程序 function count(i,j:longint):longint; var m,ti,tj,k:longint; begin if i=j then exit(0); m:=(i+j)shr 1; count:=count(i,m)+count(m+1,j); ti:=i;tj:=j;k:=i; while (ti=m)or(tj=j) do begin if tim then begin t[k]:=a[tj];inc(k);inc(tj);continue; end; if tjj then begin t[k]:=a[ti];inc(k);inc(ti);continue; end; if a[ti]a[tj] begin inc(count,m-ti+1); t[k]:=a[tj];inc(k);inc(tj);continue; end;t[k]:=a[ti];inc(k);inc(ti); end; for k:=i to j do a[k]:=t[k]; end; 例7:棋盘覆盖 有一个2k*2k的方格棋盘,恰有一个方格是黑色的,其他为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。如下图所示为L型牌的4种旋转方式。 分析 题目是要求用L型牌覆盖一个2k*2k的方格棋盘,棋盘有且只有一个黑色方格,此方格不能覆盖。 用分治来解决,平均分为4块,每一块刚好是2k-1*2k-1的方格棋盘,但只有一块中含有一个黑色方格,所以要为另外三个方格构造出一个黑色方格(不能覆盖),如下图所示: 例8:最大值最小化 把一个包含n个正整数的序列划分为m个连续的子序列(每个正整数恰好属于一个序列)。设第i个序列的各数之和为S(i),你的任务是让所有S(i)的最大值尽量小。例如序列1 2 3 2 5 4划分成3个序列的最优方案为1 2 3|2 5 |4,其中S(1)、S(2)、S(3)分别为6、7、4,最大值为7;如果划分成1 2|3 2|5 4,则最大值为9,不如刚才的好。n=106,所有数之和不超过109。 方法一 动态规划。f[i,j]表示把前i个数分成j个连续子序列的最大和的最小值。 s[i]表示前i个元素的和。 考虑第j个连续子序列的位置进行状态转移。 s[i] j=1 f[i,j]= min(max(f[k,j-1],s[i]-s[k])) (其中j-1=k=i-1) j1时 时间复杂度达到O(mn2) 单峰问题可以用决策单调性优化到O(nm)。 方法二 定义check(x)判断是否可以把原序列划分为m个和不超过x的子序列,如果可以check(x)

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档