標籤:
#include<iostream> #include<ctime>using namespace std;#define M 4#define N 4int maxline(int *array, int len) //求一維數組最大子序列和 { int i, sum = array[0], b = 0,j = 0; for (i = 0; i<len; ++i) { if (b>0) b += array[i]; else b = array[i]; if (b>sum) sum = b; } return sum;}int maxtwodimension(int n, int m, int array[M][N]){ int i, j, h,g, max, sum = -1000; int b[100]; for(g = 0;g < m;g++){ for (i = 0; i<n; i++) { memset(b, 0, sizeof(b)); //將b[100]中的數字全部初始化為0 for (j = i; j<n; j++) //把第i行到第n行相加,對每一次相加求出最大值 { for (h = g; h<m; h++) { b[h] += array[j][h]; //求一行的和,二維數組壓縮成一維數組 } max = maxline(b, h); //按照一維數組求最大子數組的方法,求最大子序列和 if (max>sum) sum = max; } } } return sum;}int main(){ int arr[M][N]; cout << "隨機二維數組為:" << endl; srand((unsigned)time(0)); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { arr[i][j] = rand() % 100-25; cout << arr[i][j] << " "; } cout << endl; } cout <<"最大子矩陣和為: "<< maxtwodimension(M, N, arr) << endl; return 0;}
設計思路:我還是根據一維數組的求解過程,把二維數組先求出每一行的和儲存到一維數組中,根據一維數組的求解過程求出二維數組最大的數組,然後逐步縮小二維數組的行數和列數繼續按照一維數組求最大子數組的方法求解。但是使用了o(n4)暫時還是想不出來o(n)的計算方法
題目:返回一個二維整數數組中最大子數組的和。