最大子串求和-动态规划

#include<stdio.h>
void find(int *a,int n);
int main(){
    int a[1000],m,n;
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    find(a,n);
    return 0;
}
void find(int *a,int n){
    int tem=a[0],max=a[0];
    for(int i=1;i<n;i++){
        if(tem<0) tem=a[i];//如果前面的子串和小于零就舍弃,并且开辟一个新的子串,从当前开始 
        else tem+=a[i];/*如果前面的子串和大于零就与现在相加,就算当前的a[i]是负数仍然相加,
因为子串是连续的,如果加上当成的a[i]后子串变成负数,那么在下一次舍弃,如果是正数那么下一次仍然可以累加上去,继续比较最大值是不是小于当前子串和。*/
        
        if(tem>max) max=tem;//更新最大子串 
    }
    printf("%d",max);
}

通过累加比较求出数组中的最大子串和

posted @ 2021-12-10 12:14  m2on  阅读(103)  评论(0编辑  收藏  举报