俊介三

一天更新一点,一天积累一点

导航

子数组之和最大(二维版本)

Posted on 2013-03-26 16:11  俊介三在前进  阅读(150)  评论(0)    收藏  举报
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define max(a,b) (a)>(b)?(a):(b)

int arr[100][100];

int find(int* arr, int len){
    int i;
    int max = arr[0];
    for(i=1;i<len;i++){
        arr[i] = max(arr[i],arr[i-1]+arr[i]);
        if(max<arr[i]) max = arr[i];
    }
    return max;
}

void create(int m, int n){
    srand(time(NULL));
    int i,j;
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            arr[i][j] = rand()%20-10;
        }
    }
    return;
}

void print(int m, int n){
    int i,j;
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            printf("%5d\t",arr[i][j]);
        }
        puts("");
    }
}

void run(int m, int n){
    create(m,n);
    print(m,n);
    int temp[100];
    int i,j,k,k2;
    int max = -999;
    int start, end;
    for(i=0;i<m;i++){
        for(j=i;j<m;j++){
            memset(temp,0,sizeof(temp));
            for(k=0;k<n;k++){
                for(k2=i;k2<=j;k2++){
                    temp[k]+=arr[k2][k];
                }
            }
            int f = find(temp,n);
            if(max<f){
                start = i;
                end = j;
                max = f;
            }
        }
    }
    printf("The max block is %d %d %d\n",max,start,end);
}

int main(){
    run(3,2);
    int temp[] = {8,-9};
    printf("%d\n",find(temp,2));
    return 0;
}

先贴代码,后来改改