求二维数组最大子数组和(或矩阵的最大子矩阵和)

思路:先对所有的连续行进行组合,如包含第一行的子矩阵,如1, 12, 123, 1---m;包含第二行的子矩阵2, 23, 234, 2--m;同理其它

再将这些子矩阵对应的列上的元素相加,此时就可以使用一维上最大子数组求和的动态规划算法了。整体的时间复杂度为O(n^3)空间复杂度为O(n)


int findMaxSumOfMatrix(vector<vector<int> > &vvi){
	int m = vvi.size();

	if(0 == m) return 0;

	int n = vvi[0].size();
	int maxValue = vvi[0][0];

	for(int i = 0; i < m; i++){ //从第0行开始 
		vector<int> vi(n, 0);
		for(int j = i; j < m; j++){ //包含第i行的矩阵 0, 01, 012, 0123, 01...m - 1
			for(int k = 0; k < n; k++){ //包含第k列的矩阵  0, 01, 012, 0123, 01...n - 1
				vi[k] += vvi[j][k]; //vi[k]表示包含i行的矩阵的 各列之和即 v[0]即从vvi[0][0]-v[k][0]之和
			}
			
			/*一维数组中求最大连续子数组之和 动态规划的运用 */
			int curSum = vi[0];
			int allSum = vi[0];	
			for(int k = 1; k < n; k++){ //从vi[k]中选出最大的子矩阵和
				curSum = max(vi[k], curSum + vi[k]);
				allSum = max(allSum, curSum);
				maxValue = max(allSum, maxValue);
			}
		}
	}

	return maxValue;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值