- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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; // 分割棋盘
原创力文档


文档评论(0)