《Cracking the Coding Interview程式設計師面試金典》----最大和子矩陣

塵封的記憶0發表於2017-05-02
時間限制:3秒 空間限制:32768K 熱度指數:443
本題知識點: 動態規劃
 演算法知識視訊講解

題目描述

有一個正整數和負整陣列成的NxN矩陣,請編寫程式碼找出元素總和最大的子矩陣。請嘗試使用一個高效演算法。

給定一個int矩陣mat和矩陣的階數n,請返回元素總和最大的子矩陣的元素之和。保證元素絕對值小於等於100000,且矩陣階數小於等於200。

測試樣例:
[[1,2,-3],[3,4,-5],[-5,-6,-7]],3

返回:10

思路:

(以第一行最為開始)先求第一行的最大和,然後將第二行資料加到第一行,
再求此時的最大值,然後再將下一行加上去,求最大值......最終得到第一列到最後一列的最大值;
還要計算第二行到最後一行的最大和,第三行到最後一行的最大和;

程式碼如下:
#include<iostream>
#include<vector>
using namespace std;
//找出該陣列的最大子陣列和
int helper(vector<int> &a){
	int temp = a[0];
	int maxVal = temp;
	for (int i = 1; i < a.size(); i++){
		if (temp < 0){
			temp = a[i];
		}
		else{
			temp += a[i];
		}
		if (temp > maxVal){
			maxVal = temp;
		}
	}
	return maxVal;
}
int sumOfSubMatrix(vector<vector<int> > mat, int n)
{
	// write code here
	int maxVal = -(1 << 31);
	for (int i = 0; i < n; i++){
		vector<int> temp = mat[i];
		maxVal = max(maxVal, helper(temp));
		for (int j = i + 1; j < n; j++){
			for (int k = 0; k < n; k++){
				temp[k] += mat[j][k];
			}
			maxVal = max(maxVal, helper(temp));
		}
	}
	return maxVal;
}

int main()
{
	vector<vector<int> > n;
	vector<int> v;
	int m;
	int temp;
	while (cin >> m)
	{
		for (int i = 0; i<m; i++)
		{
			v.clear();
			for (int j = 0; j < m; j++)
			{
				cin >> temp;
				v.push_back(temp);
			}
			n.push_back(v);
		}

		cout << sumOfSubMatrix(n, m) << endl;

	}
	return 0;
}


不懂的可以加我的QQ群:261035036(IT程式設計師面試寶典

群) 歡迎你到來哦,看了博文給點腳印唄,謝謝啦~~


相關文章