动态规划求最大连续子序列:
思想:
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 }
时间: 2024-10-14 20:35:52