动态规划解最大和子串

子串是连续的

一:刻画最优解的结构特征

设字符串为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;
}

posted @ 2013-12-18 22:23  米其林轮船  阅读(207)  评论(0编辑  收藏  举报