1. 程式人生 > >結對開發2//返回一個二維整陣列中最大子陣列的和

結對開發2//返回一個二維整陣列中最大子陣列的和

題目:返回一個二維整數陣列中最大子陣列的和

要求:1.輸入一個二維整型陣列,數組裡有正數也有負數

           2.二維陣列中,連續的一個子矩陣組成一個子陣列,每個子陣列都有一

      3.求所有子陣列和的最大值

同組人:曹建濤

 

源程式:

#include "stdafx.h"
#include <stdio.h>
int MAX(int a, int b)//求最大值
{
	if (a > b)
		return a;
	else
		return b;
}
int main(void)
{
	int a[3][6] = { { 5, 6, -3, 8, -9, 2 }, { 1, -12, 20, 0, -3, -5 }, { -9, -7, -3, 6, 7, -1 } };//初始化陣列
	printf("array a:\n");
	for (int i = 0; i<3; i++)
	{
		for (int j = 0; j<6; j++)
		{
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
	int i, j, m, n, sum;	  //n為行,m為列,mn為子陣列的左上角元素
	int p[3][6];              //a[i][j]為子陣列的右下角元素,p[i][j]為子陣列各元素之和
	int max = a[0][0];
	for (n = 0; n < 3; n++)
	{
		for (m = 0; m < 6; m++)
		{
			for (i = n; i < 3; i++)
			{
				for (j = m; j < 6; j++)
				{
					if (i == n)
					{
						if (j == m)
						{
							p[i][j] = a[i][j];
							sum = p[i][j];
							max = MAX(sum, max);

						}
						else
						{
							p[i][j] = p[i][j - 1] + a[i][j];
							sum = p[i][j];
							max = MAX(sum, max);
						}
					}
					else
					{
						if (j == m)
						{
							p[i][j] = p[i - 1][j] + a[i][j];
							sum = p[i][j];
							max = MAX(sum, max);
						}
						else
						{
							p[i][j] = p[i][j - 1] + p[i - 1][j] - p[i - 1][j - 1] + a[i][j];
							sum = p[i][j];
							max = MAX(sum, max);
						}
					}
				}
			}
		}
	}
	printf("maxsum=%d", max);
	getchar();
	getchar();
	return 0;
}

 

執行結果:

 

總結:

  在本次任務中,看似簡單清晰的思路,在程式碼上實踐起來卻遇到了重重困難。最初的想法是遍歷整個子陣列,發現時間複雜度太大,完成起來較為困難。經過和組員一同尋找網路資料,翻閱圖書,找到較為簡便的思路方法,將這個方法逐步呈現在電腦螢幕上。由最初的簡陋的框架,一步步將其完善。最終圓滿完成了老師佈置的任務。從最初的遙不可及到完成任務,是一個完善學習完善自己的一個路程,今後也會不放棄的堅持完成每一次作業,更上一層樓!

 

 

我和我小夥伴快樂的寫程式碼的一天