C语言动态规划要最好大子序列

动态规划要最好特别连续子序列:

 

思想:

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\n",sum);
19     }
20     return 0;
21 }