寻找最大连续子序列/Find the max contiguous subsequence
寻找最大连续子序列
给定一个实数序列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的更多相关文章
- hdu 1231 最大连续子序列 ,1003 Max Sum;
题目(1231) #include<stdio.h> #include<iostream> using namespace std; int main() { int K,nu ...
- K:求取数组中最大连续子序列和的四个算法
相关介绍: 求取数组中最大连续子序列和问题,是一个较为"古老"的一个问题.该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有 ...
- HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)
Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...
- 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 ...
- hdu1003 Max Sum【最大连续子序列之和】
题目链接:https://vjudge.net/problem/HDU-1003 题目大意:给出一段序列,求出最大连续子序列之和,以及给出这段子序列的起点和终点. 解题思路:最长连续子序列之和问题其实 ...
- ACM-DP之最大连续子序列——hdu1231
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- 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 ...
- 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 ...
- 动态规划(Dynamic Programming, DP)---- 最大连续子序列和
动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想,简单来使,动态规划是将一个复杂的问题分解成若干个子问题,或者说若干个阶段,下一个阶段通过上一个阶段的结 ...
随机推荐
- markdown语法介绍
1. 标题类 每级标题用"# title"表示,共支持6级标题: 2. 段落类 1.建议用换行符控制: 2.用"<p></p>"控制: ...
- Java中二进制数与整型之间的转换
import java.io.*; public class Test{ /** * 二进制与整型之间的转换 * @param args * @throws IOException */ public ...
- mysql 按日期统计
按年汇总,统计: select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col ...
- DataTable转Json,Json转DataTable
// 页面加载时 /// </summary> /// <param name="sender"></param> /// <param ...
- LintCode-73.前序遍历和中序遍历树构造二叉树
前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: ...
- 转 PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据) 通过curl_setopt()函数可以方便快捷的抓取网页(采集很方便),curl_setopt 是php的一个 ...
- 微信小程序 功能函数 计时器
let lovetime = setInterval(function () { let str = '(' + n + ')' + '重新获取' that.setData({ getText2: s ...
- linux解压zip
用 unzip 的先安装 yum install -y unzip #unzip file.zip -d /root -d指解压路径 ,不写的话默认当前目录
- 含html转义字符编码(四)转换--python
在抓取下来的网页源码显示的是如下的内容,而不是可读性的汉字 (当然,如果是在Web页面上展示,则实体会自动被浏览器转为原字符,正常显示) 经查资料后得知, 在网页中以四开头的是HTML实体,具体什么是 ...
- 关于c++中public & private方法调用问题
class IDNoIdentifier { public: IDNoIdentifier(); ~IDNoIdentifier(); typedef vector<cv::Rect> C ...