[算法练习]序列最大和

题目说明:

输入一个数列(包含正负数),求和是最大的连续子序列。例如{5,-3,4,2}的最大子序列就是 {5,-3,4,2}。

程序代码:

#include <gtest/gtest.h>
using namespace std;

int MaxSumOfSequence(int* pData, int nLength, int& nBegin, int& nEnd)
{
    if (!pData || !nLength)
    {
        return 0;
    }

    int nMaxSum = 0;
    int nCurrVal = 0;
    int nCurrBegin = 0;

    for (int i = 0; i < nLength; ++i)
    {
        nCurrVal += pData[i];
        if (nCurrVal >= nMaxSum)
        {
            nMaxSum = nCurrVal;
            nBegin = nCurrBegin;
            nEnd = i;
        }

        if (nCurrVal < 0)
        {
            nCurrVal = 0;
            nCurrBegin = i+1;
        }
    }

    return nMaxSum;
}

TEST(Algo, tMaxSumOfSequence)
{
    //
    // 5,-6,4,2
    // 5,-4,4,2
    // 5,4,-10,2    

    int Data1[] = {5,-6,4,2};
    int nBegin = 0;
    int nEnd = 0;

    ASSERT_EQ(MaxSumOfSequence(Data1,4,nBegin,nEnd),6);
    ASSERT_TRUE(nBegin==2 && nEnd==3);

    int Data2[] = {5,-4,4,2};
    ASSERT_EQ(MaxSumOfSequence(Data2,4,nBegin,nEnd),7);
    ASSERT_TRUE(nBegin==0 && nEnd==3);

    int Data3[] = {5,4,-10,2};
    ASSERT_EQ(MaxSumOfSequence(Data3,4,nBegin,nEnd),9);
    ASSERT_TRUE(nBegin==0 && nEnd==1);
}
时间: 2024-11-05 12:07:47

[算法练习]序列最大和的相关文章

序列和集合算法之序列比较

将一个序列变成另一个序列的最少修改步数. 例如下图,将字符串A变成字符串B,所需要的步骤为6个步骤,match表示0步,其他操作表示1步: 设计算法如下: public sealed class MinimumEditDistance { public int[,] CalculateDistance(string originalStr, String targetStr) { int LenA = originalStr.Length; int LenB = targetStr.Length

题解 P2642 【双子序列最大和】

前言 其实这道题的关键就是在于预处理,其方法类似于 合唱队形 正文 求最大子段和 要想求出双子序列最大和,首先我们要会求出最大子段和 最大子段和的求值方法很简单 定义 \(f_i\) 为以第 \(i\) 个数结尾的最大子段和 #include <bits/stdc++.h> using namespace std; int f[1000010],a[1000010]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++)cin>

算法导论4--求最大和数组

1 #include<iostream> 2 #include<fstream> 3 #include<cstdlib> 4 using namespace std; 5 6 struct subArray{ 7 int low; 8 int high; 9 float sum; 10 }; 11 //分治策略 o(nlogn) 递归 12 void findMaxCross(float *A, int low,int mid,int high,subArray &am

Java的序列化算法--解释序列后字节含义

Java的序列化算法 序列化算法一般会按步骤做如下事情: ◆将对象实例相关的类元数据输出. ◆递归地输出类的超类描述直到不再有超类. ◆类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值. ◆从上至下递归输出实例的数据 我们用另一个更完整覆盖所有可能出现的情况的例子来说明: class parent implements Serializable {  //超类            int parentVersion = 10;   } class contain impleme

分治算法求解序列最大子和问题

特别的,当序列所有整数均为负整数时,其最大子和为0. 1 #include <stdio.h> 2 3 int caluMaxSubSum(int *array, int left, int right); 4 5 int main() 6 { 7 int array[6] = {2, -2, 3, 1, -4, 2}; 8 int len_array = sizeof(array)/sizeof(array[0]); 9 int i = 0; 10 int subsum = caluMaxS

数据结构和算法——将序列分解为单独的变量

①问题:假如有一个包含N多个元素的元组或者序列,现在想分解为N个单独的变量. 1 L = (4, 5) 2 x, y = L ②进阶篇: data = ['sb', '大铁锤', '51', (2018, 6, 2)] a, b, c, date = data a='sb' b='大铁锤' c=51 date=(2018, 6, 2) ③ data = ['sb', '大铁锤', '51', (2018, 6, 2)] a, b, c, (year, mon, day) = data year

银行家算法-安全序列全列出实现

#include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<algorithm> #include<cmath> #include<string> #include<queue> #include<climits> #include<map> #include<stack>

使有序序列中每个元素最多出现2次的几种算法实现

问题描述(来源:leetcode--Remove Duplicates from Sorted Array II) 对于一个给定的已排序序列,要求实现一个算法:使序列中同一元素出现的次数不超过2次,对超过2次的同一元素直接删除,例如: 输入:给定序列A={1,1,1,2,2,3} 输出:要求返回length =5,A变为{1,1,2,2,3} 一.实现1 1.方式:该实现使用计数count,比较直观,而较容易想到,且扩展性较好,如果想将条件改为:最多出现n次,只需将条件count!=2改为cou

【代码相似论文笔记】基于序列聚类的相似代码检测算法

摘要: 为了提高源程序代码之间相似性的检测效率,提出一种基于序列聚类的相似代码检测算法. 算法首先把源代码按照其自身的结构进行分段提取,然后对各个分段进行部分代码变换,再以带权重的编辑距离为相似度量标准对这些符号进行序列聚类,得到相似的程序代码片段,以达到对源程序进行相似功能检测的目的. 应用: 可以通过检测源程序中的相似代码对源程序进行简化,也可以查找出多个程序之间的相似功能,还能用于抄袭检测. 步骤: 1.提取出源代码中的功能段 2.以带权重的编辑距离为相似度量标准 3.通过聚类源程序代码序