求和最大的连续子串

题目:
给定一整型数字a[]={a[0],...,a[n])},找出连续子串{a[x]),a[x+1],...,a[y]},使得和最大,其中,0<=x<=y<=n。

解法一,用循环来做,扫一遍,用两个变量分别记录当前子序列和、最大的序列和。


int LongestSubSum(int a[], int n)
{

int curSum=0, maxSum=-MaxInt, i;

for(i=0; i<n; i++)
{
curSum += a[i];

if(curSum > maxSum)
maxSum = curSum;

if(curSum < 0)
curSum = 0;
}

return maxSum;
}

Note:
 这种情况能应付输入全部为负数的情况,算法会返回最大的负数
       
 注意for里面的两个if不能颠倒了,否则全为负数时会返回0,这就不对了

若要求返回子序列和所在的区间


void LongestSubSum(int a[], int n, int* start, int* end, int* sum)
{

int *dp = new int[n];
int *begin = new int[n];
int i;

if(n>0)
{
dp[0] = a[0];
begin[0] = 0;
}
for(i=1; i<n; i++)
if(dp[i-1]+a[i]>a[i])
{
dp[i] = dp[i-1] + a[i];
begin[i] = begin[i-1];
}
else
{
dp[i] = a[i];
begin[i] = i;
}
int idxMax=0;
for(i=1; i<n; i++)
if(dp[idxMax] < dp[i])
idxMax = i;
*sum = dp[idxMax];
*start = begin[idxMax];
*end = idxMax;
}

解法二:

这是典型的dp问题,dp[i]表示以a[i]结尾的连续子串的最大和。(对比错误的:dp[i]
表示a[1..i]的最大连续子串和, 无法递推)

则递推方程为

dp[i]= dp[i-1]+a[i]  
  if  dp[i-1]+a[i] > a[i];
         
a[i]                else


int LongestSubSum(int a[], int n)
{
int *dp = new int[n];
int i;
dp[0] = 0;
for (i=1; i<n; i++)
if (dp[i-1]+a[i]>a[i])
dp[i] = dp[i-1] + a[i];
else
dp[i] = a[i];
int max = a[0];
for (i=1; i<n; i++)
if (max < dp[i])
max = dp[i];
return max;
}

若要求返回子序列和所在的区间


void LongestSubSum(int a[], int n, int* start, int* end, int* sum)
{
int *dp = new int[n];
int *begin = new int[n];
int i;
if(n>0)
{
dp[0] = a[0];
begin[0] = 0;
}
for(i=1; i<n; i++)
if(dp[i-1]+a[i]>a[i])
{
dp[i] = dp[i-1] + a[i];
begin[i] = begin[i-1];
}
else
{
dp[i] = a[i];
begin[i] = i;
}
int idxMax=0;
for(i=1; i<n; i++)
if(dp[idxMax] < dp[i])
idxMax = i;
*sum = dp[idxMax];
*start = begin[idxMax];
*end = idxMax;
}

求和最大的连续子串

时间: 2024-10-05 04:09:44

求和最大的连续子串的相关文章

算法设计--在数组中找求和最大的连续子串

问题:输入具有n个整数的向量arr,输出向量的任意连续子向量和的最大值 特殊情况(1.当向量都为正数时,为整个向量 2.当向量都为负数时,为0,即空子串 ) 1.O(n2)的算法 (循环对所有情况进行遍历) 1 #include <stdio.h> 2 #define max(a,b) ((a>b)?a:b) 3 #define max3(a,b,c) ((a>b)?((a>c)?a:c):((b>c)?b:c)) 4 5 int find1(int arr[], in

poj 3518 Corporate Identity 后缀数组-&gt;多字符串最长相同连续子串

题目链接 题意:输入N(2 <= N <= 4000)个长度不超过200的字符串,输出字典序最小的最长公共连续子串; 思路:将所有的字符串中间加上分隔符,注:分隔符只需要和输入的字符不同,且各自不同即可,没有必要是最小的字符; 连接后缀数组求解出height之后二分长度,由于height是根据sa数组建立的,所以前面符合的就是字典序最小的,直接找到就停止即可; ps: 把之前的模板简化了下,A题才是关键; #include<iostream> #include<cstdio&

POJ 3693 Maximum repetition substring (寻找重复次数最多的连续子串)

Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9083   Accepted: 2782 Description The repetition number of a string is defined as the maximum number R such that the string can be partitioned into R same conse

和最大连续子串续——和最大连续子矩阵

继上一节学习了和最大连续子串,推广到和最大连续子矩阵,以二维为例,子矩阵是矩阵行和列的组合,参考:http://blog.sina.com.cn/s/blog_a782701501016636.html 代码如下: package programming; /**最大和的连续子矩阵 * 将连续子矩阵看做是一维连续子串,然后利用和最大连续子串方法,求出连续子串,进而求出子矩阵 * @author ywf * */ public class MaxSumSubMatrix { /** * @para

最长公共连续子串--全国模拟(二)

[编程题] 最长公共连续子串 时间限制:1秒 空间限制:32768K 牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度. 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50. 输出描述: 输出为一个整数,表示最长公共连续子串的长度. 输入例子: abcde abgde 输出例子: 2 自己的解题思路:针对两个字符串,定义函数GetEqualCount来求得对于字符串long从L_start开始与字符串short比较得到的最长公共连续子

最大连续子串

问题:一个由正数.负数.0组成的序列中,求一个连续子序列,使他们之和最大 解一:暴力法,直接求出所有可能,找出最大值 1 MAX_SEQ_SUM( A, len ) 2 max = A[0] 3 max_b = max_e = 0 4 5 for i -> 0:len-1 6 sum = 0 7 for j->i:len-1 8 if j == i then sum = A[i] 9 else sum += A[i] 10 if sum > max then 11 max = sum 1

UVA 12718 Dromicpalin Substrings(寻找字符串连续子串的回文)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4456 题意:寻找给出字符串的字串中是回文的个数(注意:字串中字母换位置后能组成回文也要算在内,例如:aab之类的可以换位置为:aba 也是一个回文). 思路:只需统计每个字母出现的次数,再统计出现次数中

3 Longest Substring Without Repeating Characters(最长不重复连续子串Medium)

题目意思:求字符串中,最长不重复连续子串 思路:使用hashmap,发现unordered_map会比map快,设置一个起始位置,计算长度时,去减起始位置的值 eg:a,b,c,d,e,c,b,a,e 0 1 2 3 4 0 1 5 3 4 0 6 5 3 4 7 6 5 3 4 7 6 5 3 8 再次出现c时,将start值置为map[c]+1=3,对于下一个b,因为map[b]<start,则直接map[b]=i 1 class Solution { 2 public: 3 int len

最长公共子序列 与 最长公共连续子串

最长公共子序列 //最长公共子序列(个数) #include<iostream> using namespace std; int c[100][100]={0}; int len1,len2; int gcd(string a,string b){ len1=a.length(); len2=b.length(); int tmp=-1; for(int i=0;i<len1;i++) { for(int j=0;j<len2;j++){ if(a[i]==a[j]) c[i][