递归及分治策略.pptVIP

  • 9
  • 0
  • 约1.03万字
  • 约 59页
  • 2017-06-04 发布于湖北
  • 举报
PKU1664题 放苹果 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input 第一行是测试数据的数目t(0 = t = 20)。以下每行均包含二个整数M和N,以空格分开。1=M,N=10。 Output 对输入的每组数据M和N,用一行输出相应的K。 Sample Input 1 7 3 Sample Output 8 3 2 2 3 3 1 4 2 1 5 1 1 4 3 0 5 2 0 6 1 0 7 0 0 Divide-and-Conquer 分治策略 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模 对这些较小的实例求解(一般使用递归方法) 如果必要的话,合并这些较小问题的解,以得到原始问题的解 最大子段和 给定由n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列形如 Sum = ai + ai+1 + … + aj (i = j) 的子段和的最大值,当所有整数均为负数时最大子段和定义为0。 例如(-2,11,-4,13,-5,-2)的最大子段和为20。 练习题 “格雷(Gray)码”是一个长度为2的n次方的序列,满足: 每个元素都是长度为n比特的串 序列中无相同元素 连续的两个元素恰好只有1个比特不同 例如:n=2时,格雷码为{00,01,11,10}。 Gray码是一种编码,这种编码可以避免在读取时,因各数据位时序上的差异造成的误读。格雷码在工程上有广泛应用。但格雷码不便于运算,请你使用分治法设计一种构造方法,输入长度序列n,输出格雷码。 当n=1时,输出格雷码{0, 1} 当n1时,格雷码的长度为,即共有个码序列。此时,将问题一分为二,即上半部分和下半部分。上半部分最高位设为0,下半部分最高位设为1。剩下n-1位的格雷码的构造采用递归的思路。 Strassen矩阵乘法 使用与上例类似的技术,将矩阵A,B和C中每一矩阵都分块成4个大小相等的子矩阵。由此可将方程C=AB重写为: 传统方法:O(n3) 分治法: 由此可得: 复杂度分析 T(n)=O(n3) Strassen矩阵乘法 传统方法:O(n3) 分治法: 为了降低时间复杂度,必须减少乘法的次数。 复杂度分析 T(n)=O(nlog7) =O(n2.81)?较大的改进 Strassen矩阵乘法 传统方法:O(n3) 分治法: O(n2.81) 更快的方法?? Hopcroft和Kerr已经证明(1971),计算2个2×2矩阵的乘积,7次乘法是必要的。因此,要想进一步改进矩阵乘法的时间复杂性,就不能再基于计算2×2矩阵的7次乘法这样的方法了。或许应当研究3×3或5×5矩阵的更好算法。 在Strassen之后又有许多算法改进了矩阵乘法的计算时间复杂性。目前最好的计算时间上界是 O(n2.376) 是否能找到O(n2)的算法? * 棋盘覆盖 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 * 棋盘覆盖 当 k0 时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘。 特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。 * 为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。 * 棋盘覆盖 void chessBoard(int tr, int tc, int dr, int dc, int size) { if (size == 1) return; int t = tile++, // L型骨牌号 s = size/2; // 分割棋盘 // 覆盖左上角子棋盘 if (dr tr + s dc tc + s) // 特殊方格在此棋盘中 chessBoard(tr, tc, dr, dc, s); else {// 此棋盘中无特殊方格 // 用 t 号L型骨牌覆盖右下角 board[tr + s - 1][tc + s - 1] = t; // 覆盖其余方格 chessBoard(tr, tc, tr+s-1, tc+s-1, s);}

文档评论(0)

1亿VIP精品文档

相关文档