最大子序列和问题的解

最大的子序列和的问题:

给定整数A1,A2,...,An(可能有负数),求Σjk=i   Ak 的最大值(为方便起见,如果所有整数均为负数,则最大子序列的和为0)。

这道题应该是比较基础的题目,有多种解法,时间复杂度也不尽相同,在这里就给大家介绍一种最有效的算法,其时间复杂度为O(n).

代码如下:

应该是比较好理解的。。。。注意题目要求所有整数均为负数时输出0.

int MaxSubsequenceSum(const int A [] , int N )
{
   int  ThisSum , Maxsum , j ;

   ThisSum = MaxSum = 0 ;
   for( j=0 ; j<N ; j++ )
   {
       ThisSum + = A [ j ] ;

       if( ThisSum > MaxSum )
            MaxSum = ThisSum ;
       else
            if( ThisSum < 0)
               ThisSum = 0 ;
   }

   return MaxSum ;
}
时间: 2024-08-01 11:08:54

最大子序列和问题的解的相关文章

最长不下降子序列nlogn算法详解

今天花了很长时间终于弄懂了这个算法……毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子序列的长度(nlogn的算法没法求出具体的序列是什么) 定义:a[1..n]为原始序列,d[k]表示长度为k的不下降子序列末尾元素的最小值,len表示当前已知的最长子序列的长度. 初始化:d[1]=a[1]; len=1; (0个元素的时候特判一下) 现在我们已知最长的不下降子序列长度为1,末尾元素

最长上升子序列nlogn解法详解 poj 2533

先上一个n^2的算法: 1 #include <iostream> 2 using namespace std; 3 4 const int N = 1000; 5 int a[N]; 6 int g[N]; 7 8 int main () 9 { 10 int n; 11 while ( cin >> n ) 12 { 13 for ( int i = 0; i < n; i++ ) 14 { 15 cin >> a[i]; 16 g[i] = 1; 17 }

最长递增(不减)子序列

问题: 拿POJ 2533来说. Sample Input 71 7 3 5 9 4 8 Sample Output(最长上升/非降子序列的长度) 4 解法一(O(n^2)): 如何把这个问题分解成子问题呢?经过分析,发现 “求以ak(k=1, 2, 3…N)为终点的最长上升子序列的长度”是个好的子问题――这里把一个上升子序列中最右边的那个数,称为该子序列的“终点”.虽然这个子问题和原问题形式上并不完全一样,但是只要这N个子问题都解决了,那么这N个子问题的解中,最大的那个就是整个问题的解. 由上

Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp

题目链接:点击打开链接 题意: 给定n长的一个序列 再给定k长的一个序列 求LCIS并输出这个子序列 如有多解输出任意解.. = - = 敲的时候听着小曲儿pre的含义还没有想清楚,万万没想到就过了... #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<mat

编程之美---求数组中最长递增子序列

写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 解法一:用动态规划,找出以当前元素结尾的最大递增子序列长度.dp[i+1] = max{1, dp[i]+1} ,array[i+1]>array[k] ,k<=i; 复杂度为o(n*n + n). 解法二:另外开一个数组保存长度为i的递增子序列的长度最大的最后一个元素最小的值,然后当处理数组中第i个元素时,从当前最大子序列的长度开始递减,依次寻找直到arrary[i]大于当前最大子序列长度的末尾元素值,然后更

【算法导论之七】动态规划求解最长公共子序列

一.动态规划的概念 动态规划(Dynamic Programming)是通过组合子问题的解而解决整个问题的.分治算法是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原始问题的解,与此不同,动态规划适用于子问题不是独立的情况,也就是各个子问题包含公共的子问题.在这种情况下,采用分治法会做许多不必要的工作,即重复地求解公共地子问题.动态规划算法对每个子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类问

POJ 2533 Longest Ordered Subsequence(LIS:最长上升子序列)

http://poj.org/problem?id=2533 题意: 给你一个长度为n的数字序列, 要你求该序列中的最长(严格)上升子序列的长度. 分析: 解法一: O(n^2)复杂度. 令dp[i]==x 表示以第i个数字结尾的上升子序列中最长的为x长度. 初始化: dp[0]=0且dp[i]=1 i>=1时. 状态转移: dp[i] =max( dp[j]+1 ) 其中j<i 且a[j]<a[i]. 最终所求:max(dp[i])  其中1<=i<=n. 解法二: O(n

USACO2020JAN Platinum T2 官方正解的翻译?

USACO2020JAN Platinum T2 官方正解的翻译? 感觉这道题一时半会儿讲不清楚 所以把文章翻译一遍,然后以注解的形式把讲的不太清楚的地方重新理解以下. (Benjamin Qi的分析) 以下令\(MOD=10^9+7\). 一些常数优化技巧: 将\(MOD\)定义为常量. 在加或减两个int时避免使用%运算. 对于下文中提到的举证,使用固定大小的二维数组储存(而非c++中的vector套vector). 不必遍历矩阵中等于零的项(即后文中矩阵的下对角线部分). 定义一个关于模运

UVa 497 - Strategic Defense Initiative

题目:最大上升子序列,输出一组解. 分析:dp,LIS.数据较小 O(n^2)算法即可. 设以第i个数字作为最大上升子序列中的最后一个数的长度为 f(i),则有转移方程: f(i)= max(f(j)) { 0=< j < i  && data[j] < data[i] }: 用一个数组记录前驱,递归输出即可. 说明:注意输出格式有点纠结. #include <iostream> #include <cstdlib> #include <cs