水了三道水DP题 最大M字段和的O(n)算法想了恩久没想出来.....

hit1760
#include<stdio.h>
#include
<string.h>

int main()
{
    
int n;
    
while(scanf("%d"&n)==1 && n)
    
{
        
int hold=0, mxa=0;
        
int i, Num;
        
for(i=0; i<n; i++)
        
{
            scanf(
"%d"&Num);
            mxa
=mxa>hold+Num ? mxa : hold+Num;
            hold
=hold+Num>0 ? hold+Num : 0;
        }

        
if(mxa>0)printf("The maximum winning streak is %d.\n",mxa);
        
else printf("Losing streak.\n");
    }

    
return 0;
}

PKU2479
#include<stdio.h>
#include
<string.h>

int t, n;
int num[50010], mxa1[50010], mxa2[50010], hold, mxa;

int main()
{

    scanf(
"%d"&t);
    
while(t--)
    
{
        scanf(
"%d"&n);
        
int i;
        mxa
=0;
        hold
=0;
        
for(i=0; i<n; i++)
        
{
            scanf(
"%d"&num[i]);

            
if(i==0 || mxa1[i-1]<=hold+num[i])    mxa1[i]=hold+num[i];
            
else if(i>0) mxa1[i]=mxa1[i-1];

            
if(hold+num[i]<=0)    hold=0;
            
else hold+=num[i];
        }

        hold
=0;
        
for(i=n-1; i>=0; i--)
        
{
            
if(i==n-1 || mxa2[i+1]<=hold+num[i])    mxa2[i]=hold+num[i];
            
else if(i<n-1) mxa2[i]=mxa2[i+1];

            
if(hold+num[i]<=0)    hold=0;
            
else hold+=num[i];

            
if(i>0 && i<n-1 && mxa<mxa1[i]+mxa2[i+1|| i==n-2)    
                mxa
=mxa1[i]+mxa2[i+1];
        }

        printf(
"%d\n", mxa);
    }


    
return 0;
}

HDU1003

#include<stdio.h>
#include
<string.h>




int main()
{
    
int t, k;
    scanf(
"%d"&t);
    
for(k=1; k<=t; k++)
    
{
        
int n;
        scanf(
"%d"&n);
        
int i, num, mxa=0, hold=0, ib=0, ie=0, ihb=0;
        
for(i=0; i<n; i++)
        
{
            scanf(
"%d"&num);
            
if(i==0 || mxa<hold+num) mxa=hold+num, ib=ihb, ie=i;
            
if(hold+num<0) hold=0, ihb=i+1;
            
else hold+=num;
        }

        printf(
"Case %d:\n", k);
        printf(
"%d %d %d\n", mxa, ib+1, ie+1);
        
if(k!=t)printf("\n");
    }


    
return 0;

}