#include <stdio.h> void maxLineSum(int array[],int len){ int max_endinghere=0; int max_sofar=0; int idx_max_endinghere_left=0; int idx_max_endinghere_right=0; int idx_max_sofar_left=0; int idx_max_sofar_right=0; for(int i=0;i<len;i++){ if(max_endinghere<0){ max_endinghere=array[i]; idx_max_endinghere_left=idx_max_endinghere_right=i; }else{ max_endinghere+=array[i]; idx_max_endinghere_right=i; } if(max_sofar<max_endinghere){ max_sofar=max_endinghere; idx_max_sofar_left=idx_max_endinghere_left; idx_max_sofar_right=idx_max_endinghere_right; } } for(i=idx_max_sofar_left;i<=idx_max_sofar_right;i++){ printf("%d,",array[i]); } } void main(){ int array[8]={-5,-3,5,6,9,10,-3,-8}; maxLineSum(array,8); }
扩展一下,求一个矩阵的最大子矩阵:
#include<stdio.h> void getMaxMatrix(int array[][3],int row ,int col){ int max_endinghere=0; int max_sofar=0; int max_endinghere_row_min=0; int max_endinghere_row_max=0; int max_endinghere_col_min=0; int max_endinghere_col_max=0; int max_sofar_row_min=0; int max_sofar_row_max=0; int max_sofar_col_min=0; int max_sofar_col_max=0; int *b=new int[row]; int tmp=0; for(int i=0;i<col;i++){ for(int j=i;j<col;j++){ max_endinghere_col_min=i; max_endinghere_col_max=j; for(int k=0;k<row;k++){ for(int m=i;m<=j;m++){ tmp+=array[k][m]; } b[k]=tmp; tmp=0; } for(k=0;k<row;k++){ if(max_endinghere<0){ max_endinghere=b[k]; max_endinghere_row_min=max_endinghere_row_max=k; }else{ max_endinghere+=b[k]; max_endinghere_row_max=k; } if(max_endinghere>max_sofar){ max_sofar=max_endinghere; max_sofar_row_min=max_endinghere_row_min; max_sofar_row_max=max_endinghere_row_max; max_sofar_col_min=max_endinghere_col_min; max_sofar_col_max=max_endinghere_col_max; } } max_endinghere=0; //注意这里 } } printf("max_sofar_row_min=%d,max_sofar_row_max=%d\n",max_sofar_row_min,max_sofar_row_max); printf("max_sofar_col_min=%d,max_sofar_col_max=%d\n",max_sofar_col_min,max_sofar_col_max); printf("max_sofar=%d\n",max_sofar); } void main(){ int array[3][3]={{1,-3,2},{-5,3,8},{1,9,-2}}; getMaxMatrix(array,3,3); }