C_求最大连续子序列和
题目:
输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:
序列:-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_求最大连续子序列和的更多相关文章
- HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)
Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...
- HDU 1231:最大连续子序列 解题报告
第一次写博客, 自己总结写出了一道题感觉值得保存. 自己总结的规律:求最大连续子序列, 可以先求包括第N项在内的前N项最大值, (因为每一项都求过后, 前N项最大值最大的那一个元素所连续的序列即为最大 ...
- dp经典问题-最大连续子序列和 hdu1003
题目描述: 这道题我先后做过三遍,结果每一遍都没有做出来.今天再仔仔细细的研究了一下,才发现用动态规划更好理解. 关于求最大连续子序列和的博文转载如下:https://www.cnblogs.com/ ...
- 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 ...
- Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)
https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...
- 《github一天一道算法题》:分治法求数组最大连续子序列和
看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...
- K:求取数组中最大连续子序列和的四个算法
相关介绍: 求取数组中最大连续子序列和问题,是一个较为"古老"的一个问题.该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有 ...
- 最大连续子序列乘积(DP)
题目来源:小米手机2013年校园招聘笔试题 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含多个测试样例.每个测试样例的第一行仅包含正整数 ...
- [ACM_其他] 总和不小于S的连续子序列的长度的最小值——尺缩法
Description: 给定长度为n的整数数列,A[0],A[1],A[2]….A[n-1]以及整数S,求出总和不小于S的连续子序列的长度的最小值.如果解不存在,则输出0. Input: 输入数据有 ...
随机推荐
- Select2 多层次赋值时异步赋值的问题
场景: 当选择人员时加载人员,选择部门时加载部门.所以在人员下,选择人员A后,如果选择部门,会触发二级select 重新获取数据. 问题: 使用select2()方法进行绑定远程数据后,对第二个sel ...
- 关于tornado中session的总结
#!/usr/bin/env python# _*_ coding:utf-8 _*_ import tornado.webimport tornado.ioloop container = {} # ...
- Visual Studio 中使用万能头文件 #include <bits/stdc++.h>
最近开始使用VS,之前用的DEV C++软件可直接使用 #include <bits/stdc++.h> ,但VS中并没有,为了使用方便,可直接在VS中添加此头文件,方法如下: 1.在安 ...
- JMeter实现Oracle参数化(1)
http://www.ithao123.cn/content-10469577.html
- Zabbix监控Tomcat案例
今天在这里,我们来聊一聊JMX监控方式, JMX(java管理扩展程序)是java平台上为应用程序,设备,系统等植入管理功能的框架,JMX可以跨越一系列不同的系统平台,更加灵活的服务管理应用: 在za ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案
Asp.Net Core2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到 ...
- JavaScript 组数去重demo
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- BZOJ3240 [Noi2013]矩阵游戏 矩阵 快速幂 卡常
原文链接http://www.cnblogs.com/zhouzhendong/p/8084891.html 题目传送门 - BZOJ3240 题意概括 F[1][1]=1F[i,j]=a*F[i][ ...
- laydate时间组件
laydate时间组件使用笔记 /*! laydate-v5.0.9 日期与时间组件 MIT License http://www.layui.com/laydate/ By 贤心 */ ;!func ...
- 线段树(lazy)-hdu1689
题目链接:https://vjudge.net/problem/HDU-1698 题目描述: 现在Pudge想做一些操作.让我们将钩子的连续金属棒从1编号到N.对于每个操作,Pudge可以将连续金属棒 ...