分治法思想

  将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解.

分治模式在每层递归时都有三个步骤:

  分解原问题为若干子问题,这些子问题是原问题的规模较小的实例;

  解决这些子问题,递归地求解各个子问题,然而,若子问题的规模足够小,则直接求解

  合并这些子问题的解成原问题的解.




例子:

归并排序.

排序的一种方法,递归地把数组分成两部分,即为分解,当数组只有一个元素或0个元素,就解决了这个小问题,然后再合并两个数组.搞定!

View Code

逆序对.

数组中下标小但是数值大的即为.递归地分解为左右两半部分,结果就是所有在左边的和所有在右边的和大的在左边小的在右边的和

View Code

一个最大子序列

即一个数组中连续的序列中和最大的,这三个都特别相似.递归分解,要不在左边,要不在右边,要不横跨左右.

View Code

/*分治法---一个最大子序列*/
#include <stdio.h>#define MAXLEN 1000int arr[MAXLEN];int Max_Sub_Sum(int a[],int s,int e);      //传进数组的指针和起始,终止下标,返回最大子序列的值
int Max_Crossing_Sum(int a[],int s,int m,int e);    //最大为a[]中一部分在下标为[s...m]中,一部分下标在[m+1...e]中的拼接int main(void)
{int temp,len=0;while (scanf_s("%d",&temp)!=EOF){arr[len++]=temp;}puts("输入如下:");for (int i=0;i<len;i++){printf("%d ",arr[i]);}putchar('\n');printf("一个最大子序列为:%d ",Max_Sub_Sum(arr,0,len-1));getchar();return 0;
}int Max_Sub_Sum(int arrtemp[],int s,int e)     //当然,传进来的s是不会大于e的,即 s<=e
{if (s<e)    //这里至少有两个元素
    {int m=(s+e)/2;int MaxLeft=Max_Sub_Sum(arrtemp,s,m);        //都在左边int MaxRight=Max_Sub_Sum(arrtemp,m+1,e);     //都在右边int MaxTwoParts=Max_Crossing_Sum(arrtemp,s,m,e);    //横跨左右if (MaxLeft>=MaxRight&&MaxLeft>=MaxTwoParts){return MaxLeft;}else if (MaxRight>=MaxLeft&&MaxRight>=MaxTwoParts){return MaxRight;}else{return MaxTwoParts;}}else    //如果两个相等,则只有一个元素,当然就是它了
    {return arrtemp[s];}
}int Max_Crossing_Sum(int arrtemp[],int s,int m,int e)   //[s...m]和[m+1...e],这里就暴力求解了,这里每个数组至少一个元素
{int len1=m-s+1;int len2=e-m;int maxSum=0;int maxLeft=0,leftTemp=0;for (int i=m;i>=s;i--)   //左边最大
    {leftTemp+=arrtemp[i];if (leftTemp>maxLeft){maxLeft=leftTemp;}}int maxRight=0,rightTemp=0;for (int i=m+1;i<=e;i++){rightTemp+=arrtemp[i];if (rightTemp>maxRight){maxRight=rightTemp;}}return maxLeft+maxRight;
}

转载于:https://www.cnblogs.com/jiayith/archive/2013/05/07/3065267.html

(分治)分治法 及 题目相关推荐

  1. [Leetcode][分治法]相关题目汇总/分析/总结

    题目汇总 以下链接均为我博客内对应博文,有解题思路和代码,不定时更新补充. 目前范围:Leetcode前150题 分治法相关题目 两个排序数组的中位数 请找出这两个有序数组的中位数.要求算法的时间复杂 ...

  2. 大整数乘法(分治法)

    大整数乘法(分治法) 题目描述:设X和Y都是n位的十进制整数,计算它们的乘积X*Y. 如果按照我们日常的计算方法,应该就是将两个数逐位相乘,最后加起来得到最终的结果,时间复杂度为O(n2); 因此我们 ...

  3. 分治法的思想与经典题目

    目录 分治法简介 分治法主定理 分治算法的时间复杂度 分治法的基本步骤 分治法的使用条件 分治法的经典题目 50. Pow(x, n) 53. 最大子序和 169. 多数元素 分治法简介 分治法,即& ...

  4. python分治算法_Python算法:分治法

    本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法 本节的标题写全了就是:divide the problem instance, solve subproblems recur ...

  5. 珍宝鸭的力扣练习(7):分治法题目合集

    动态规划和分治法的区别 动态规划也是一种分治思想(比如其状态转移方程就是一种分治),但与分治算法不同的是,分治算法是把原问题分解为若干个子问题,自顶向下求解子问题,合并子问题的解,从而得到原问题的解. ...

  6. python矩阵乘法分治算法_矩阵乘法的Strassen算法详解 --(算法导论分治法求矩阵)...

    1 题目描述 2 思路分析 3 解法 4 小结 1 题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 2 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数 ...

  7. 2_2 递归与分治策略(分治法的基本思想)

    基本思想:将复杂问题简单化,大事化小,小事化了,很符合中国人的思想. 打官腔:分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解, ...

  8. python分治算法_python算法实现-分治法

    分治法概念将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题----"分" 将最后子问题可以简单的直接求解----"治" 将所有子问 ...

  9. python分治算法_分治法及其python实现例子

    在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...

最新文章

  1. Commonjs规范
  2. 开发人员常用SVN命令
  3. C#访问Access完整增删改查代码
  4. 基于MATLAB的turbo码代码,一种基于Simulink的Turbo码仿真实现
  5. long 转为string_面试必问 Redis数据结构底层原理String、List篇
  6. 交叉调试 arm linux,搭建交叉调试环境Arm-Linux-Gdb与gdbserver
  7. 捐赠3亿元驰援疫情后,腾讯再出2亿元发起“战疫开发者公益联盟”
  8. Nginx安装的两种方法
  9. jsp中java代码注释_JSP页面中的三种代码注释方法
  10. matlab编运行的程序吗,matlab2020怎么运行-matlab运行程序的方法步骤
  11. java 图片加多处水印_Java在Word中添加多行图片水印
  12. post-GWAS:使用coloc进行共定位分析(Colocalization)
  13. 远程服务器证书过期怎么解决,关于演示win7远程桌面证书过期的具体操作方式...
  14. matlab论文致谢,2020大学毕业论文致谢信
  15. R语言逻辑回归预测分析付费用户
  16. 基于VCP虚拟串口的Rosserial接口教程
  17. pcd,obj,mtl文件格式解析
  18. 文献管理软件 linux,5款常用的文献管理软件
  19. 有关一个公用的BPL的问题
  20. 亚商投资顾问 早餐FM/1028华为海外推广5.5G

热门文章

  1. ipsec说明以及隧道案例
  2. 入住博客园,小庆一下
  3. ERP项目实施记录06
  4. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案(转)
  5. Python数据分析Numpy库方法简介(一)
  6. 交通运输部·车载导航系统——终端如何与服务器通信——玩转通信协议(源码下载)...
  7. FastDFS-单机版安装
  8. kernel.sem信号量参数调优,以及ipcs信号量队列查询
  9. 大唐电信[600198]股票
  10. cisco 增强型内部网关路由协议EIGRP笔记