zoukankan      html  css  js  c++  java
  • 动态规划求最大子序列

    动态规划求最大连续子序列:

    思想:

    1、如果在array[1,N]中存在最大连续子序列array[i,j],那么对于任何的k(i<=k<=j)均有array[i,k]大于0。假设array[i,k]小于0,由条件知array[i,j]为最大连续子序列,且由等式array[i,k](小于0)+array[k+1,j]=array[i,j](最大连续子序列),知array[k+1,j]>arra[i,j],即array[k+1,j]为最大子序列。与已知条件矛盾。

    2、因此,我们可以把array[1,N]分割为若干个子串,使得其除去最后一个字符串以外每个子串的和小于0,且对所有子串array[i,j]和任意k(i<=k<=j)均有array[i,j]<0且array[i,k]>0,此时我们要说明的是,满足条件的和最大子串,只能是上述某个子串的前缀,而不可能跨越多个子串。

    因此我们得到该类型题的解决方案:

    从头到尾遍历扫描数组,将数组分割成若干个子串(除去最后一个子串其余任何子串和小于0),同时也得到每个子串的最大前缀之和,比较得到最大前缀和即为最大连续子序列之和。比如对于数列:{-10 1 2 3 4 -5 -23 3 7 -21} 通过分隔成若干子串得到{-10} {1 2 3 4 -5 -23} {3 7 -21}三个子串,每个子串的最大前缀和为-10 10 10

    故最大连续子序列之和为10。

     C语言代码:

     1 #include <stdio.h>
     2 int count;
     3 int sum,thisSum;
     4 int main(){
     5     int len;
     6     while(scanf("%d",&len)!=EOF&&len!=0){
     7         //
     8         sum=thisSum=0;
     9         int tmp;
    10         while(len--){
    11             scanf("%d",&tmp);
    12             thisSum+=tmp;
    13             if(thisSum<0)
    14                 thisSum=0;
    15             if(thisSum>sum)
    16                 sum=thisSum;
    17         }
    18         printf("%d
    ",sum);
    19     }
    20     return 0;
    21 }
  • 相关阅读:
    SSO单点登录机制
    Web应用中Service层获取request对象 | RequestContextHolder的使用
    J2EE中数据字典的使用详解
    Redis高级(事务,持久化,主从复制读写分离,以及安全设置)
    Redis的五种数据类性以及对应的操作命令
    Redis客户端与基本命令
    VMware15安装CentOS8
    用内置的库turtle来画一朵花,python3
    python之经典猜数字
    python,寻找班级里面名字最长的人
  • 原文地址:https://www.cnblogs.com/WingPig/p/5260491.html
Copyright © 2011-2022 走看看