【c语言】输入一组整数,求出最大子序列的和
2015-07-08 16:40
489 查看
输入一组整数,求出最大子序列的和.
例如:序列: - 2 11 - 4 13 - 5 - 2,则最大子序列和为20。
序列: - 6 2 4 - 7 5 3 2 - 1 6 - 9 10 - 2,则最大子序列和为16
遍历是一种方法:
还有一种思想。联机算法。
重点的一个思想是:如果a[i]是负数那么它不可能代表最大序列的起点,因为任何包含a[i]的作为起点的子序列都可以通过用a[i+1]作为起点来改进。
类似的有,任何的负的子序列不可能是最优子序列的前缀。
例如:序列: - 2 11 - 4 13 - 5 - 2,则最大子序列和为20。
序列: - 6 2 4 - 7 5 3 2 - 1 6 - 9 10 - 2,则最大子序列和为16
遍历是一种方法:
#include <stdio.h> int Max_Son(int *p, int len) { int Max_Sum = 0; int i, j; for (i = 0; i < len; ++i) { int sum = 0; for (j = i; j < len; ++j) { sum = sum + p[j]; if (sum > Max_Sum) { Max_Sum = sum; } } } return Max_Sum; } int main() { int arr[] = { -2, 11, -4, 13, -5, -2 }; int array[] = { -6, 2, 4, -7, 5, 3, 2, -1, 6, -9, 10, -2 }; int len = sizeof(arr) / sizeof(arr[0]); int lena = sizeof(array) / sizeof(array[0]); printf("%d\n", Max_Son(arr, len));//20 printf("%d\n", Max_Son(array, lena));//16 return 0; }
还有一种思想。联机算法。
重点的一个思想是:如果a[i]是负数那么它不可能代表最大序列的起点,因为任何包含a[i]的作为起点的子序列都可以通过用a[i+1]作为起点来改进。
类似的有,任何的负的子序列不可能是最优子序列的前缀。
#include <stdio.h> #include <assert.h> int Max_Son(int *arr, int len) { int Max_Sum = 0; int sum = 0; int j; assert(arr != NULL); for (j = 0; j < len; ++j) { sum = sum + arr[j]; if (sum > Max_Sum) Max_Sum = sum; else if (sum < 0) sum = 0; } return Max_Sum; } int main() { int arr[] = { -2, 11, -4, 13, -5, -2 }; int array[] = { -6, 2, 4, -7, 5, 3, 2, -1, 6, -9, 10, -2 }; int len = sizeof(arr) / sizeof(arr[0]); int lena = sizeof(array) / sizeof(array[0]); printf("%d\n", Max_Son(arr, len));//20 printf("%d\n", Max_Son(array, lena));//16 return 0; }
相关文章推荐
- C++中引用的本质
- C++中引用的本质
- 使用C语言的7个步骤
- C语言学习笔记
- 黑马程序员——C语言基础---流程控制(选择结构,循环结构)
- c++ 时间类型详解 time_t
- C++中的位拷贝与值拷贝
- C/C++中判断某一文件或目录是否存在
- DFT离散傅立叶变换C++实现
- 新加坡总理公开多年前写的数独程序源码(C++版)
- 新加坡总理公开多年前写的数独程序源码(C++版)
- FFT快速傅立叶算法纯C语言版本
- C语言内存分析
- C++调用一个成员函数的需求this指针的情况
- 黑马-C语言-结构体
- C++——对象和类
- 黑马程序员-C语言学习笔记(循环)
- C++ 开源库
- eclipse安装C++工程环境----CDT环境————eclipse开发openCV环境准备2
- 黑马程序员——C语言基础---基本运算