练习题一:最大连续和问题:长度为n的序列,求最大连续和。

 1 /**2      * 最大连续和问题:长度为n的序列,求最大连续和。3      * 枚举解法4      * 时间复杂度O(n^3)5      * @param a6      */7     public static int test1(int[] a) {8         int max=a[0];9         for(int i=0;i<a.length;i++) {
10             for(int j=i;j<a.length;j++) {
11                 int sum=0;
12                 for(int m=i;m<=j;m++) {//求[i,j]的和
13                     sum+=a[m];
14                 }
15                 if(sum>max)max=sum;
16             }
17         }
18         return max;
19     }
20     /**
21      * 最大连续和问题:长度为n的序列,求最大连续和。
22      * S[i]表示a[0]+...+a[i]则S[j]-S[i-1]表示[i,j]的和
23      * 时间复杂度:O(n^2)
24      * @param a
25      */
26     public static int test2(int[] a) {
27         //求S[i]
28         int[] s=new int[a.length];
29         s[0]=a[0];
30         for(int i=1;i<a.length;i++) {
31             s[i]=s[i-1]+a[i];
32         }
33         int max=s[0];
34         for(int i=1;i<a.length;i++) {
35             for(int j=i;j<a.length;j++) {
36                 if(s[j]-s[i-1]>max)
37                     max=s[j]-s[i-1];
38             }
39         }
40         return max;
41     }
42     /**
43      * 最大连续和问题:长度为n的序列,求最大连续和。
44      * 对test2的优化,s[j]-s[i-1]对于确定的j,s[i-1]越小结果越大,记录当前出现的最小值
45      * 时间复杂度O(n)
46      * @param a
47      */
48     public static int test3(int[] a) {
49         //求S[i]
50         int[] s=new int[a.length];
51         s[0]=a[0];
52         for(int i=1;i<a.length;i++) {
53             s[i]=s[i-1]+a[i];
54         }
55         int min=s[0],max=s[0];
56         for(int i=1;i<a.length;i++) {
57             if(s[i]-min>max) max=s[i]-min;
58             if(s[i]<min) min=s[i];
59         }
60         return max;
61     }
62     /**
63      *  最大连续和问题:长度为n的序列,求最大连续和。
64      * 分治算法
65      * 时间复杂度O(nlogn)
66      * @return
67      */
68     public static int test4(int[] a,int x,int y) {
69         if(y-x==1) return a[x];//只剩一个元素,直接返回
70         //划分
71         int m=x+(y-x)/2;
72         int maxs=Math.max(test4(a,x,m), test4(a,m,y));//[x,m) [m,y)
73         int v=0,L,R;
74         //从m向右
75         L=a[m];
76         for(int i=m;i<y;i++) {
77             L=Math.max(L, v+=a[i]);
78         }
79         //从m-1向左
80         v=0;R=a[m-1];
81         for(int i=m-1;i>=x;i--) {
82             R=Math.max(R, v+=a[i]);
83         }
84         return Math.max(maxs, L+R);
85     }

可以看到本问题的分治法解法,将对数组求最大连续和的问题划分为求[x,m)[m,y)的最大值,以及在[x,y)之间的连续最大值的起点和终点(所以它算法是以m为划分点向两边扩散开,最后把L+R合并),这三个子问题,逐步求解

DP解法:

/*** 求解最大子段和*/public static void test(int[] a) {int[] b=new int[a.length];//从i到n最大的最大和//b[i]=max(a[i],b[i+1]+a[i])b[a.length-1]=a[a.length-1];int maxsum=Math.max(b[a.length-1], 0);for(int i=a.length-2;i>=0;i--) {if(b[i+1]>0)b[i]=b[i+1]+a[i];elseb[i]=a[i];if(b[i]>maxsum) {maxsum=b[i];}}}

进行空间优化,观察可知b数组只用到了b[i+1],所以只需保存b[i+1]即可,但是这样最优解就会变得难求

/*** 求解最大子段和*/public static void test(int[] a) {int b=a[a.length-1];int maxsum=Math.max(b, 0);for(int i=a.length-2;i>=0;i--) {if(b>0)b=b+a[i];elseb=a[i];if(b>maxsum) {maxsum=b;}}}

练习题二:排序和搜索

合并排序(求逆序对数)

快速排序(求从小到大第k个数)

二分查找

练习题三:大整数乘法

设X和Y都是n位二进制数现在要计算他们的乘积XY。

按正常的乘法规则要做n2次一位数的乘法,计算步骤太多。下面用分治法来解决此问题:

将n位的二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见,假设n是2的幂),如图所示。

由此,X=A2n/2+B ,Y=C2n/2+D。(计组里面乘法的原理)这样,X和Y的乘积为:
XY=(A2n/2+B)(C2n/2+D)=AC2n+(AD+CB)2n/2+BD  (1)  

计算时间复杂度:

T(1)=1

T(n)=4T(n/2)+O(n)

解得T(n)=O(n2)。由此可见,仍需要n2次乘法

XY=AC2n+[(A-B)(D-C)+AC+BD]2n/2+BD     (2)
虽然,式(2)看起来比式(1)复杂些,但它仅需做3次n/2位整数的乘法(AC,BD和(A-B)(D-C)),6次加、减法和2次移位。由此可得:

T(1)=1

T(n)=3T(n/2)+cn

其解为T(n)=O(nlog3)=O(n1.59)

可以看到如果要降低复杂度,在分成的规模一定时,减少子问题的个数,可以降低复杂度。用多次次要矛盾代替主要矛盾

练习题四:Strassen矩阵乘法

Strassen采用了类似于在大整数乘法中用过的分治技术,将计算2个n阶矩阵乘积所需的计算时间改进到O(nlog7)=O(n2.81)。

第八章 (一)分治 练习题相关推荐

  1. 【点分治练习题·不虚就是要AK】点分治

    [点分治练习题·不虚就是要AK]点分治 不虚就是要AK(czyak.c/.cpp/.pas)  2s 128M  by zhb czy很火.因为又有人说他虚了.为了证明他不虚,他决定要在这次比赛AK. ...

  2. 2013年MBA、MPA、MPAcc入学考试综合能力辅导教材

    <2013年MBA.MPA.MPAcc入学考试综合能力辅导教材> 基本信息 作者: 全国工商管理硕士入学考试研究中心 出版社:机械工业出版社 ISBN:9787111395553 上架时间 ...

  3. 计算机操作系统第八章测试题及答案,《计算机基础》第八章练习题

    第八章 习 题 一.选择题 (1)中文Word编辑软件的运行环境是 C A)DOS B)WPS C)Windows D)高级语言 (2)段落的标记是在输入什麽之后产生的? B A)句号 B)Enter ...

  4. 编程珠玑第八章——分治算法求解数组中的最大的连续和

    关键在于把数组分为两个部分a,b.最大的连续和要么在a要么在b,另外还有可能就是跨越a,b的边界,将跨越边界的最大向量称为mc. 一个注意的地方就是mc正在a中的部分包含右边边界的最大子向量,而mc在 ...

  5. Java程序设计梁勇第十版第八章编程练习题

    (前八章如果您有需要,直接在评论注说,我发给你)本章所有题目代码都是本人自己写的,全部自己运行成功了,可以直接复制粘贴. 这些重要都附加了英文注释,方便解析使大家明白,如果您在此阅读过程中发现程序代码 ...

  6. 翁恺《C语言程序设计》(第四版)何钦铭 例题+练习题代码 第八章-指针

    第八章-指针 例8-1 #include <stdio.h>int main(void) {int a = 5432;int *p = NULL;p = &a;printf(&qu ...

  7. 【luogu P5655 基础数论函数练习题】【分治+数论】

    题意 给出nnn个数,有qqq次询问,每次询问一个区间内的lcm对1e9+71e9+71e9+7取模后的值. n,q,T≤300,1≤ai≤260n,q,T\le 300,1\le a_i\le 2^ ...

  8. 《Python核心编程》第二版第八章练习题答案 第二部分

    8–7. 全数. 完全数被定义为这样的数字: 它的约数(不包括它自己)之和为它本身. 例如: 6 的约数是 1, 2, 3, 因为 1 + 2 + 3 = 6 , 所以 6 被认为是一个完全数. 编写 ...

  9. 2021算法竞赛入门班第二节课【递归、分治、二分】练习题

    目录 华华给月月准备礼物[二分] The Biggest Water Problem[模拟] Bits[递归模拟 / 未完成] [NOIP2004]FBI树[树的后序遍历] [USACO 2009 D ...

  10. C语言程序设计 练习题参考答案 第八章 文件(2)

    /* 8.8从文件ex88_1.txt中取出成绩,排序后,按降序存放EX88_2.TXT中 */ #include "stdio.h" #define N 10 struct st ...

最新文章

  1. 纯css3鼠标经过出现文字或图片鼠标移走消失
  2. Linux 爱好者该向闭源软件敞开怀抱了
  3. 等差数列划分 II - 子序列(动态规划)
  4. 关于SQL语言,这些你不得不了解!
  5. React Native获取设备信息组件
  6. count(*),count(1),count(0)效率
  7. 解决wordpress后台管理访问速度慢的问题
  8. 一个拨号上网的批处理文件
  9. 深蓝词库转换2.2发布,支持手心输入法和Win10微软拼音
  10. 再战高端智能电动化,错失先机的长安能靠华为“翻盘”?
  11. 矩阵与拼接屏如何连接之方案详解
  12. SpringBoot整合JdbcTemplate(五)
  13. 字节跳动基于ClickHouse优化实践之“高可用”
  14. android 类似苹果底部弹框,Android 仿苹果底部弹出Dialog
  15. sis最新ip地址2020入口一_【新版教材】2020最新人教版高中化学教材必修一电子课本...
  16. (二十一)查询我的订单
  17. <数据结构> rear指针指向队尾元素 牺牲一个存储位置 的循环队列实现(C语言)(第4种/共6种)
  18. 【GA】Genetic Algortihm(A)
  19. mysql 1032_MySQL 报错 Last_SQL_Errno: 1032
  20. 感谢各位iPhone12机主,苹果又高了

热门文章

  1. bash实现自动补全
  2. qemu模拟器下编译运行基于riscv指令集的Linux操作系统
  3. 部署中遇到的问题(四)
  4. JDBC数据源(DataSource)的简单实现
  5. 个类似GoogleMap的客户端JS开源库
  6. 上一页、下一页链接(采用分页方式)
  7. 使用PhoneNumberValidator判断用户输入的电话格式,并用PhoneFormatter对电话号码格式化。...
  8. Struts原理、开发及项目实施
  9. P ⊆ co-NP的原因
  10. 牛顿法为什么比梯度下降法求解需要的迭代次数更少?