经典面试题——二维矩阵子矩阵和问题

来源:互联网 发布:旅游规划行业知乎 编辑:程序博客网 时间:2024/05/17 01:12



两种方法:有空再详细说明


#include <iostream>#include <iomanip>using namespace std;int sumOfArray_1(int** array, int m, int n){  int **a = new int*[m+1];    int **sum = new int*[m+1];  for(int i = 0 ; i <= m; ++i){    sum[i] = new int[n+1];    a[i] = new int[n+1];    memset(sum[i], 0, sizeof(int)*(n+1));    memset(a[i], 0, sizeof(int)*(n+1));  }  for(int i = 1 ; i <= m; ++i)    for(int j = 1; j <= n; ++j)      a[i][j] = *((int*)array+(i-1)*n + j-1);  for(int i = 1; i <= m; ++i){    for(int j = 1; j <= n ; ++j){      sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];      cout<<sum[i-1][j]<<'+'<<sum[i][j-1]<<'-'<<sum[i-1][j-1]<<"+"<<a[i][j]<<"->";      cout<<"sum["<<i<<"]["<<j<<"]="<<sum[i][j]<<endl;    }  }    int maxSum = 0;    for(int i_min = 1; i_min <= m; ++i_min)    for(int i_max =i_min; i_max <= m ; ++i_max)      for(int j_min = 1; j_min<= n; ++j_min)        for(int j_max = j_min; j_max<= n; ++j_max){          int tmp = sum[i_min-1][j_min-1] + sum[i_max][j_max] - sum[i_min-1][j_max] -sum[i_max][j_min-1];          if(tmp>maxSum){            maxSum = tmp;            cout<<"("<<i_min<<", "<<j_min<<")->("<<i_max<<", "<<j_max<<")"<<endl;          }        }  for(int i = 0 ; i < m ; ++i)    delete[] sum[i];  return maxSum;}int sumOfArray_2(int** array, int m, int n){  int **a = new int*[m+1];    int **sum = new int*[m+1];  for(int i = 0 ; i <= m; ++i){    sum[i] = new int[n+1];    a[i] = new int[n+1];    memset(sum[i], 0, sizeof(int)*(n+1));    memset(a[i], 0, sizeof(int)*(n+1));  }  for(int i = 1 ; i <= m; ++i)    for(int j = 1; j <= n; ++j)      a[i][j] = *((int*)array+(i-1)*n + j-1);  for(int i = 1; i <= m; ++i){    for(int j = 1; j <= n ; ++j){      sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];      cout<<sum[i-1][j]<<'+'<<sum[i][j-1]<<'-'<<sum[i-1][j-1]<<"+"<<a[i][j]<<"->";      cout<<"sum["<<i<<"]["<<j<<"]="<<sum[i][j]<<endl;    }  }  int maxSum = 0;    for(int a = 1; a <= m; ++a){    for(int c = a; c <= m; ++c){      int start = sum[c][0]-sum[a-1][0];      int all = start;      for(int i = 1; i <= n; ++i){        if(start<0)          start = 0;        start += sum[c][i]-sum[a-1][i]-sum[c][i-1]+sum[a-1][i-1];        cout<<setw(2)<< start<<' ';        if(start>all)          all = start;      }      if(all>maxSum)        maxSum = all;      cout<<endl;    }  }  for(int i = 0 ; i < m ; ++i)    delete[] sum[i];  return maxSum;}int main(){  const int m = 3;  const int n = 5;  int array[m][n] = {{ 1, 2, 0, 3, 4},                     { 2, 3, 4, 5, 1},                     { 1, 1, 5, 3, 0}};  cout<<sumOfArray_2((int**)array,m,n)<<endl;  system("PAUSE");  return 0;}