子串是连续的
一:刻画最优解的结构特征
设字符串为a,c[i]表示以a[i]结尾的所有子串中最大和子串的和。则a的最大和子串的和就是
max(c[i]),0<=i<=len(a)
二:递归定义最优解的值
最优解的值为c[i],
c[i] = a[i] (c[i-1]<0)
c[i] = c[i-1] + a[i] (c[i-1]>=0)
三:自底向上的方法
for i = 0 to len(a)-1,由于c[i]依赖c[i-1],所以i递增。
四:构建最优解
在球最大和的时候,可以记录a[i],即最大和子串的尾端,通过尾端向前搜索,找出和等于c[i]的子串。
代码如下:
#include<iostream>
using namespace std;
int main()
{
int a[] = {4,-5,6,8,-3,-9,15,25};
int alen = sizeof(a)/sizeof(int);
int c[alen];
memset(&c, 0, sizeof(c));
c[0] = a[0];
int q = -10000;
int k = -1;
for(int i = 1; i<alen; i++)
{
if(c[i-1]<0)
c[i] = a[i];
else
c[i] = c[i-1] + a[i];
if(q<=c[i])
{
q = c[i];
k = i;
}
}
cout<<q<<"-"<<k<<endl;
return 0;
}