zoukankan      html  css  js  c++  java
  • 动态规划解最大和子串

    子串是连续的

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

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

  • 相关阅读:
    Win7 安装
    线上java排查
    spring boot
    redisson
    Jcaptca 图片
    URL重写
    gradle导出依赖的jar包
    Redis tomcat
    flex 通过htmlservices链接moss的rest(rest 的get post方式)
    java语言MySQL批处理
  • 原文地址:https://www.cnblogs.com/johnsblog/p/3481193.html
Copyright © 2011-2022 走看看