最大子段和、子矩阵总结

来源:互联网 发布:华为 移动数据 4g开关 编辑:程序博客网 时间:2024/04/27 15:34

九度题目1011:最大连续子序列

    给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。
输入:

    测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( K< 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。

输出:

    对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。

样例输入:
6-2 11 -4 13 -5 -210-10 1 2 3 4 -5 -23 3 7 -2165 -8 3 2 5 01103-1 -5 -23-1 0 -20
样例输出:
20 11 1310 1 410 3 510 10 100 -1 -20 0 0

const int Max_N = 10008 ;int   N , x[Max_N]  ;void Ans(){     int  Max_sum  = -0xffff ;  // 最大和初值为最小     int  Start = 1, End = 1 , sum = 0 , i , j = 1 ;     for(i = 1 ; i <= N ; i++){        sum += x[i] ;        if(sum < 0){          sum = 0 ;          j = i + 1 ;  //当前和不能作为结果,更新sum ,同时下一个序列起点为下一点i+1 。         }        else if(sum > Max_sum){  //更新 ,当前点为终点。同时更新起点j            Max_sum = sum ;            Start = j ;            End = i ;        }     }     if(Max_sum == -0xffff)  //最大值为初值,说明全为负数。         printf("%d %d %d\n" , 0 , x[1] , x[N]) ;     else         printf("%d %d %d\n" , Max_sum , x[Start] , x[End]) ;}

  HDU 1003  Max Sum 最大子段和 

const int Max_N = 100008 ;int   N , x[Max_N]  ;void Ans(){     int  Max_sum  = -0xffff ;  //     int  Start = 1, End = 1 , sum = 0 , i , j = 1 ;     for(i = 1 ; i <= N ; i++){        sum += x[i] ;        if(sum > Max_sum){            Max_sum = sum ;            Start = j ;            End = i ;        }        if(sum < 0){          sum = 0 ;          j = i + 1 ;        }     }     printf("%d %d %d\n" , Max_sum , Start , End) ;}


最大子矩阵  To the Max

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=74


int  MaxSum(int n , int a[]){     int sum = - 128 ;     int b = 0 ;     for(int i = 1 ; i <= n ; i++){           if(b > 0) b += a[i] ;           else  b = a[i] ;           if(b > sum) sum = b ;     }     return sum ;}const int Max_N = 108  ;int  g[Max_N][Max_N] ;int  sum[Max_N][Max_N] ;int  N ;int  num[Max_N]  ;int  GetMax(){     int i , j  , t  , k , ans = -128 ;     memset(sum , 0 , sizeof(sum))  ;     for(i = 1 ; i <= N ; i++)        sum[1][i] =  g[1][i] ;     for(i = 2 ; i <= N ; i++){         for(j = 1 ; j <= N ; j++)            sum[i][j] = sum[i-1][j] + g[i][j]  ;     }     for(i = 1 ; i <= N ; i++){         for(j = i ; j <= N ; j++){              for(k = 1 ; k <= N ; k++)                  num[k] = sum[j][k] - sum[i-1][k] ;              ans = max(ans , MaxSum(N , num)) ;         }     }     return ans ;}int  main(){     int i , j ;     while(cin>>N){          for(i = 1 ; i <= N ; i++)             for(j = 1 ; j <= N ; j++)                cin>>g[i][j] ;          cout<<GetMax()<<endl ;     }     return 0 ;}






0 0
原创粉丝点击