动态规划求最大子序列

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

思想:

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 }
原文地址:https://www.cnblogs.com/WingPig/p/5260491.html