蛮力法:

int maxSum1(int a[], int n){int i;int j;int maxSum = 0;for(i = 0; i < n; i++){int sum = 0;for(j = i; j < n; j++){sum += a[j];if(sum > maxSum){maxSum = sum;}}}return maxSum;}

分治法:

int maxSum2(int left, int right, int a[]){int center , i;int sum, left_sum, right_sum;int left_max, right_max;if(left == right)return a[left] ;else{center = (left + right) / 2;left_sum = maxSum2(left, center, a);right_sum = maxSum2(center+1, right, a);sum = 0;left_max = 0;//求左边的最大值for(i = center; i >= left; i--){sum += a[i];if(sum > left_max){left_max = sum;}}sum = 0;right_max = 0;//求右边的最大值for(i = center + 1; i <= right; i++){sum += a[i];if(sum > right_max){right_max = sum;}}sum = right_max+ left_max;if(sum < left_sum)sum = left_sum;if(sum < right_sum)sum = right_sum;}return sum ;
}

动态规划法:

void maxSum3(int a[], int n){int b[n];int i, j, s = n - 1;int maxSum = 0;b[0] = a[0]; //只有一个数时  最大子段和是其本身for(i = 1; i < n; i++){if(b[i - 1] > 0)b[i] = b[i - 1] + a[i];else{  //前面的值小于0  直接从当前原数组开始b[i] = a[i];}}/*   printf("\n\n动态规划法 打印b数组:");for(i = 0; i < n; i++){printf("%d  ", b[i]);}printf("\n");
*/for(j = 0; j < n; j++){if(b[j] > maxSum){s = j;maxSum = b[j];}}printf("\n动态规划法求出最大子段和为:%d", maxSum);for(i = s-1; i >= 0; i--){if(b[i] <= 0)break;}printf("\n\n打印最大子段:\n");for(i = i + 1; i <= s; i++){printf("%d  ", a[i]);}}

完整代码:

#include <stdio.h>
#include <stdlib.h>
#define N 10
//判断是否全为负数
int IsFuShu(int a[], int n){int i = 0;for(i = 0; i < n; i++){if(a[i] > 0)break;}if(i == n)return -1; //全是负数时elsereturn 0; //有正数时}//蛮力法
//从第一个数开始,找第一个到最后一个数间最大字段和;再从第二个数开始
int maxSum1(int a[], int n){int i;int j;int maxSum = 0;for(i = 0; i < n; i++){int sum = 0;for(j = i; j < n; j++){sum += a[j];if(sum > maxSum){maxSum = sum;}}}return maxSum;}//分治法
int maxSum2(int left, int right, int a[]){int center , i;int sum, left_sum, right_sum;int left_max, right_max;if(left == right)return a[left] ;else{center = (left + right) / 2;left_sum = maxSum2(left, center, a);right_sum = maxSum2(center+1, right, a);sum = 0;left_max = 0;//求左边的最大值for(i = center; i >= left; i--){sum += a[i];if(sum > left_max){left_max = sum;}}sum = 0;right_max = 0;//求右边的最大值for(i = center + 1; i <= right; i++){sum += a[i];if(sum > right_max){right_max = sum;}}sum = right_max+ left_max;if(sum < left_sum)sum = left_sum;if(sum < right_sum)sum = right_sum;}return sum ;
}//动态
void maxSum3(int a[], int n){int b[n];int i, j, s = n - 1;int maxSum = 0;b[0] = a[0]; //只有一个数时  最大子段和是其本身for(i = 1; i < n; i++){if(b[i - 1] > 0)b[i] = b[i - 1] + a[i];else{  //前面的值小于0  直接从当前原数组开始b[i] = a[i];}}/*   printf("\n\n动态规划法 打印b数组:");for(i = 0; i < n; i++){printf("%d  ", b[i]);}printf("\n");
*/for(j = 0; j < n; j++){if(b[j] > maxSum){s = j;maxSum = b[j];}}printf("\n动态规划法求出最大子段和为:%d", maxSum);for(i = s-1; i >= 0; i--){if(b[i] <= 0)break;}printf("\n\n打印最大子段:\n");for(i = i + 1; i <= s; i++){printf("%d  ", a[i]);}}void Print(int a[], int n){printf("打印数组:\n");int i;for(i = 0; i < n; i++){printf("%d   ", a[i]);}
}void Creat(int a[]){int i,m;printf("输入数组的值:");for(i = 0; i < N; i++){scanf("%d", &m);a[i] = m;}}
int main()
{//  int a[N] = {1,-1, 0, 2, -3, 4, -1, 0, -2, 4};int a[N];Creat(a);Print(a, N);int sum = IsFuShu(a, N);if(sum == -1)//全是负数值为0printf("最大子段和是0");else{sum = maxSum1(a, N);printf("\n蛮力法求出最大子段和是:%d\n" , sum);sum = maxSum2(0, N-1, a);printf("\n分治法求出最大子段和是:%d\n" , sum);maxSum3(a, N);}return 0;
}

运行结果:

最大子段和问题-蛮力法、分治法、动态规划法相关推荐

  1. 求最大字段和问题(常规法,分治法,动态规划法)

    算法设计与分析-----求最大字段和问题 问题描述:给定由n个整数组成的序列(a1,a2,a3......,an),求该序列的子段的最大值. 常规法: 从a1开始,求出以a1开头的子序列最大的和为su ...

  2. 最大子段和(动态规划及分治法)

    动态规划法: 首先给一个任意的序列来说明这个问题 1 2 3 -1 -5 4 5 8 首先设一个dp数组,dp[i]表示前i个区间的最大子段和 如果dp[i-1] > 0,那么dp[i] = d ...

  3. 计算最大子段(分治法)

    这个程序使用分治法计算最大子段,结果为最大子段之和,用递归程序实现. 原始数据使用随机函数生成. 采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可. 数据个 ...

  4. 几个常见的简单的算法(暴力法,递推法,枚举法,递归法,分治法,贪心法,回溯法)

    最近在学习算法相关知识. 通过买的视频教程了解到了一些简单的算法,为了加深感悟,同时也为了理解,将这几个常见的算法的定义进行记录. 算法是程序的灵魂,也可以认为是程序最重要的部分. 在通过算法解决问题 ...

  5. java分治法求数列的最大子段和_同事为进大厂天天刷Java面试题,面试却履败!究其原因竟是它在捣鬼。...

    写在前面 疫情过后,招聘与求职受影响到底有多大?我不知道,但我的真实感受是,即使有疫情的影响,最近还是持续有朋友来跟我说他们今年工作的新动向.有人跳槽去了大厂,有人下定决心出来创业,也有人还在观望,等 ...

  6. python 实现分治法的几个例子

    分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质.3) 利用该问题分解出的子问题 ...

  7. 算法笔记_065:分治法求逆序对(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序)   1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...

  8. 小黄的刷题之路(十六)——五行魔法(枚举/蛮力法)

    文章目录 一.题目 二.分析思路 2.1 审题理解 2.2 思路 三.代码实现 3.1. C++实现 四.总结 一.题目 二.分析思路 2.1 审题理解 每一块五行石都有金木水火土五种能量(0表示没有 ...

  9. 最近点对问题(蛮力法和分治法)

    最近点对问题(蛮力法和分治法) 1.一维空间 1.1蛮力法 1.2分治法 2.二维空间 代码参考链接: http://t.csdn.cn/flREB 1.一维空间 1.1蛮力法 代码: import ...

  10. 蛮力法-分治法-处理最近对问题

    两种方法对最近对问题的解释 背景描述:   终于,隔了将近一周,开始更新第二篇算法博客.今天的问题是最近对问题.问题描述如下:对于二维坐标系中的若干个点,从中判断出相距最近的两个点,并输出最近的这个距 ...

最新文章

  1. python3 reqeusts后写入excel
  2. 修改boot.ini
  3. 查看mysql的版本的四种方法
  4. P2303 [SDOI2012] Longge(数论/欧拉函数)
  5. redis源码剖析(三)——基础数据结构
  6. Web前端JavaScript笔记(7)ECMA6新增数组方法
  7. AI量化交易(二)——Tushare财经数据框架
  8. 台式计算机英特尔时间同步,我电脑时间没法与Inter同步,?
  9. 分数间隔 matlab,分数间隔均衡器
  10. 为什么华为a1路由器网速变慢_华为路由器上网速度慢怎么办?
  11. python stack unstack_Python之数据重塑
  12. Google战略的深远意义
  13. linux系统bcast,Linux系统下取IP地址的几种方法
  14. LOD原理及相关实现方式
  15. RT201 国产PA射频功率放大器 兼容RFX2401C
  16. CLCL-多重剪切板
  17. gdal无法读取中文标题的图片的解决办法(结合Qt)
  18. 制作CPA静默安装包和静默包软件捆绑方法
  19. JVM监控及诊断工具-GUI
  20. VeryCD的名言集锦

热门文章

  1. Java IO(非常详细)
  2. 点餐系统ip地址_教你一步一步做无线点餐项目(登录篇)
  3. wd移动硬盘插电脑没反应_西数移动硬盘-急急急!!!!!西部数据移动硬盘插在电脑上不显示盘符了,有人知道? 爱问知识人...
  4. WIN10 删除文件 找不到该项目
  5. Matlab绘制柱状图, 设置figure的最大最小值
  6. 无线教育带来BYOD的A+体验
  7. 读者推荐 · 一个美观的简历生成器
  8. (己解决)黑苹果驱动英特尔核显疑问记录
  9. 4.1 手工编写第一个Jmeter性能测试脚本
  10. ug如何导入excel数据点_ug怎么导入 点数据库