题目:

输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:

序列:-2 11 -4 13 -5 -2,则最大子序列和为20。

序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。

1.

 /*
算法一:穷举法(3个for)
时间复杂度:O(n^3) */
#include <stdio.h>
#include <malloc.h> int Max = ;
int find_max(int len, int arr[]){
int i, j, k, sum;
for(i=; i<len; i++){
for(j=i; j<len; j++){
sum = ;
for(k=i; k<=j; k++){
sum += arr[k];
}
if(sum > Max){
Max = sum;
}
}
}
return Max; } int main(){
int i, len, *arr;
printf("请输入数组的长度: ");
scanf("%d",&len);
arr = (int *)malloc(sizeof(int)*len);
printf("请输入数组的值:");
for(i=; i<len; i++){
scanf("%d",&arr[i]);
}
find_max(len,arr);
printf("最大连续子序列和 :%d\n", Max ); return ;
}

2.

 /*
算法二:算法一的优化 (2个for)
时间复杂度:O(n^2)
*/
#include <stdio.h>
#include <malloc.h> int Max = ;
int find_max(int arr[],int n, int len){
int i, sum = ;
for(i=n; i<len; i++){
sum += arr[i];
if(sum > Max){
Max = sum ;
}
}
return Max;
} int main(){
int i, len, *arr;
printf("请输入数组的长度:");
scanf("%d",&len);
arr = (int *)malloc(sizeof(int)*len);
printf("请输入数组的值:");
for (i=; i<len; i++)
{
scanf("%d", &arr[i]);
} for(i=; i<; i++){
find_max(arr,i, len);
} printf("最大连续子序列和:%d \n",Max); return ;
}

 将代码进行以下修改,可以得到该最大子序列和的开始元素和结束元素(low,high)

 int find_max(int len, int arr[]){
int i, j, sum, low, high;
for(i=; i<len; i++){
sum = ;
for(j=i; j<len; j++){
sum += arr[j];
if(sum > Max){
Max = sum;
low = i;
high = j;
}
}
}
printf("The low is :%d\nThe high is : %d\n",arr[low],arr[high]);
return Max;
}

3.

 /*
算法三:联机算法
时间复杂度:O(n)
*/
#include <stdio.h>
#include <malloc.h> int Max = ;
int find_max(int len, int arr[])
{
int i, sum = ;
for(i=; i<len; i++)
{
sum += arr[i];
if(sum > Max)
{
Max = sum;
}else if(sum < ){
sum = ;
}
} return Max;
} int main(){
int i, len, *arr;
printf("请输入数组的长度:");
scanf("%d",&len);
arr = (int *)malloc(sizeof(int)*len);
printf("请输入数组的值:");
for (i=; i<len; i++)
{
scanf("%d", &arr[i]);
}
find_max(len, arr);
printf("最大连续子序列和:%d \n",Max);
return ;
}

对以上代码进行小的改动,通过生成一系列的随机数进行测试程序运行的时间,由于程序运行的很快,需要通过重复循环取平均值的方法得到程序执行一次的时间。参考:http://www.cnblogs.com/LinSL/p/7475001.html

 #include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h> clock_t start,stop;
double duration; void fun(int len,int arr[]); int main(){
int len, *arr, i;
printf("Please enter the len:");
scanf("%d",&len);
arr = (int*)malloc(sizeof(int)*len); for(i=; i<len; i++){
arr[i] = rand()%-;/*产生-1000~1000之间的随机数*/
printf("%d ",arr[i]);
}
printf("\n");
start = clock();
fun(len,arr);
stop = clock();
duration = ((double)(stop - start))/CLK_TCK;
printf("The duration is:%f\n",duration);/*0.0000*/
return ;
} void fun(int len,int arr[]){
int max=,
sum=,
i;
for(i=; i<len; i++){
sum += arr[i];
if(sum > max){
max = sum;
}else if(sum < ){
sum = ;
}
}
printf("The max_sum is:%d\n",max);
}

参考:http://blog.163.com/kevinlee_2010/blog/static/169820820201010495438247/

C_求最大连续子序列和的更多相关文章

  1. HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

  2. HDU 1231:最大连续子序列 解题报告

    第一次写博客, 自己总结写出了一道题感觉值得保存. 自己总结的规律:求最大连续子序列, 可以先求包括第N项在内的前N项最大值, (因为每一项都求过后, 前N项最大值最大的那一个元素所连续的序列即为最大 ...

  3. dp经典问题-最大连续子序列和 hdu1003

    题目描述: 这道题我先后做过三遍,结果每一遍都没有做出来.今天再仔仔细细的研究了一下,才发现用动态规划更好理解. 关于求最大连续子序列和的博文转载如下:https://www.cnblogs.com/ ...

  4. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] E 三分+连续子序列的和的绝对值的最大值

    E. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)

    https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...

  6. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...

  7. K:求取数组中最大连续子序列和的四个算法

    相关介绍:  求取数组中最大连续子序列和问题,是一个较为"古老"的一个问题.该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有 ...

  8. 最大连续子序列乘积(DP)

    题目来源:小米手机2013年校园招聘笔试题 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含多个测试样例.每个测试样例的第一行仅包含正整数 ...

  9. [ACM_其他] 总和不小于S的连续子序列的长度的最小值——尺缩法

    Description: 给定长度为n的整数数列,A[0],A[1],A[2]….A[n-1]以及整数S,求出总和不小于S的连续子序列的长度的最小值.如果解不存在,则输出0. Input: 输入数据有 ...

随机推荐

  1. Nginx代理实现内网主机访问公网服务

    通过Nginx代理实现内网主机访问公网和接口服务 1.需求: m2.test.com为公司测试环境的微信测试域名,因为要调用微信服务接口需要访问外网,现通过Nginx代理现实此功能. 2.环境如下: ...

  2. 【Android】jar包Proguard混淆方法

    本文章的前提条件是,读者已经掌握了正确导出jar包的技能. 1.拷贝Android项目中“proguard.cfg”文件到你指定的位置,并改名为“proguard.pro”,此步是为proguardg ...

  3. 【Android】ContentValues的用法

    ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而 ...

  4. Python_configparser模块

    configparser : 用于处理ini结构相似的文件,格式类似于: [DEFAULT] # 相当于一个分组 # option # 注释,说明性文字 ,默认以# 或‘:’开头的行 option1 ...

  5. Python学习(七) —— 装饰器、迭代器、生成器

    一.装饰器(decorator) 1.装饰器的本质是闭包函数,作用:在不改变函数的调用方式的情况下,给函数的前后添加新的功能 #装饰器的固定结构 def warpper(func): #定义装饰器函数 ...

  6. web实现下拉列表多选加搜索

    实现如图所示的下拉多选还能带有搜索功能. <!DOCTYPE html> <html> <head> <title></title> < ...

  7. Vue 组件(上)转载

    一.定义 组件:应用界面上一个个的区块. 自定义的HTML元素. 二.创建和注册 Vue.extend() 扩展,创建组件构造器 Vue.component()注册组件,2个参数,1为标签,2是组件构 ...

  8. 001_JavaScript学习

    1,面向对象,事件驱动 2,动态,交互性 3,解释性语言,非强(弱)类型变量:不用声明,解释时检查类型 4,区分大小写,嵌入html,句尾加分号,可以独立保存为一个外部文件,但其中不能包含<sc ...

  9. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第三集之磁盘分区】

    磁盘分区的概念对接下来的自定义安装Linux具有重要作用.(可以直接先看第四集之Linux安装就能知道分区的重要性) ----------------------------------------- ...

  10. 在github上创建新的分支(包括管理分支)

    考虑到前面的项目在master分支上,这个不是太友好,下面在只有master分支的基础上,新建一个dev分支 一:查看 1.查看本地分支 git branch 2.查看远程分支 git branch ...