寻找最大连续子序列

给定一个实数序列X1,X2,...Xn(不需要是正数),寻找一个(连续的)子序列Xi,Xi+1,...Xj,使得其数值之和在所有的连续子序列数值之和中为最大。

一般称这个子序列为最大子序列,例如,在序列(2,-3,1.5,-1,3,-2,-3,3)中,最大的子序列是(1.5,-1,3)它的和是3.5,在一个给定的序列中可能有几个最大子序列。

如果所有的数值为负数,则最大子序列为空(由定义,空的子序列之和为0)。我们希望有一个解决该问题的算法,并且仅对此序列扫描一次。

扩展问题,算法至少还求出一个最大子序列,并且输出。

算法要点:当临时子序列之和小于零时,需要重置临时子序列之和为零,相当于重新起点计算子序列。

如下方法定义于工具类:MaxSubsequenceUtil

public static double FindMaxSubsequence(double[] array, out int startIndex)
{
double GlobeMax = , tmpMax = ;
startIndex = -;
for (int i = array.Length - ; i >= ; i--)
{
tmpMax = tmpMax + array[i];
if (GlobeMax < tmpMax)
{
GlobeMax = tmpMax;
startIndex = i;
}
else if (tmpMax < )
{
tmpMax = ;
}
}
return GlobeMax;
}

方法调用和输出子序列方法:

static void Main(string[] args)
{
double[] dArray = new double[] { , -, 1.5, -, , -, -, };
dArray.ToList<double>().ForEach(d => Console.Write("{0} ", d));
int startIndex;
double max = MaxSubsequenceUtil.FindMaxSubsequence(dArray, out startIndex);
if (max == )
{
Console.WriteLine("No max subsequence exist!");
}
else
{
Console.WriteLine();
Console.WriteLine("The max total is:{0}", max);
Console.WriteLine("The max subsequence is:");
double t = ;
for (int i = startIndex; i < dArray.Length; i++)
{
t += dArray[i];
if (t == max)
{
Console.Write("{0} ", dArray[i]);
break;
}
Console.Write("{0} ", dArray[i]);
}
}
Console.ReadKey();
}

完毕。

下载源码

作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。

http://www.cnblogs.com/andyzeng/p/3672547.html

寻找最大连续子序列/Find the max contiguous subsequence的更多相关文章

  1. hdu 1231 最大连续子序列 ,1003 Max Sum;

    题目(1231) #include<stdio.h> #include<iostream> using namespace std; int main() { int K,nu ...

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

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

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

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

  4. HDU 1003 Max Sum && HDU 1231 最大连续子序列 (DP)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  5. hdu1003 Max Sum【最大连续子序列之和】

    题目链接:https://vjudge.net/problem/HDU-1003 题目大意:给出一段序列,求出最大连续子序列之和,以及给出这段子序列的起点和终点. 解题思路:最长连续子序列之和问题其实 ...

  6. ACM-DP之最大连续子序列——hdu1231

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  7. 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 ...

  8. ZOJ 3872 Beauty of Array 连续子序列求和

    Edward has an array A with N integers. He defines the beauty of an array as the summation of all dis ...

  9. 动态规划(Dynamic Programming, DP)---- 最大连续子序列和

    动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想,简单来使,动态规划是将一个复杂的问题分解成若干个子问题,或者说若干个阶段,下一个阶段通过上一个阶段的结 ...

随机推荐

  1. 【Linux 运维】 安装PHP工具Composer

    一.安装PHP 由于Composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的 ...

  2. UVa 1586 - Molar Mass - ACM/ICPC Seoul 2007 - C语言

    关键在于判断数字是两位数还是单位数,其他部分没有难度. #include"stdio.h" #include"string.h" #include"c ...

  3. c# 批量处理数据录入

    c# 分批处理数据录入 //using System.Text; //using System.Data; //using System.Data.SqlClient; //using System; ...

  4. C# 生成行和列

    private DataTable GetListBind() { DataTable dt = new DataTable(); try { dt.Columns.Add("1" ...

  5. 推荐形参使用常量引用:void func(const T &);

    一.声明为const的原因: 把函数不会改变的形参定义成普通的引用会带给函数的调用者一种误导,即函数可以修改它的实参的值: 限制函数所能接受的实参类型,如不能把const对象.字面值或者需要类型转换的 ...

  6. Python-列表练习

    1.使用列表生成式生成如下列表:[1,9,25,49,81] s = [i**2 for i in range(1,10)if i%2==1] print(s) 2.输入一个由英文单词组成的字符串(分 ...

  7. Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  8. python 项目配置虚拟环境

    # Windows 环境1, 安装 Visual C++ 2015 Build Tools, 依赖.Net Framework 4.6, 安装包位置 ./tools/windows/visualcpp ...

  9. C语言特殊符号

    -> ->在C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符“.”.用法:p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员.表达式p->a引用了 ...

  10. 3dContactPointAnnotationTool开发日志(七)

      调了半天发现是逻辑错误,改了一下终于没那么奇怪了:   但是有的接触点很明显跑偏了.再回顾一下自己是怎么求的,我是直接用的下面的代码求解一个点是否在另一个物体内部: var bounds = us ...