一道經典的動態規劃問題:最大和子矩陣
有一個正整數和負整數組成的NxN矩陣,請編寫代碼找出元素總和最大的子矩陣。請嘗試使用一個高效算法。
給定一個int矩陣mat和矩陣的階數n,請返回元素總和最大的子矩陣的元素之和。保證元素絕對值小於等於100000,且矩陣階數小於等於200。
測試樣例:
[[1,2,-3],[3,4,-5],[-5,-6,-7]],3
返回:10
思路: 將二維的矩陣最大和子矩陣轉化爲一維數組最大和子數組的問題。怎麼轉化呢?假設輸入數組爲mat[][],首先在mat[0]中求解出最大和子數組,然後將mat[1]加到mat[0],繼續求解最大和子數組,一直到n.當然也要比較從mat[1]起始的最大和子數組,因爲我們不能保證mat[0]求解了最大和子數組後和mat[1]相加之後求解最大和子數組的和比直接求解mat[1]的最大和子數組大,同樣也要對mat[2]…..mat[n - 1]做同樣操作。
//package com.nowcoder.CodingCrack.SubMatrix;
import java.util.*;
public class SubMatrix {
public int sumOfSubMatrix(int[][] mat, int n) {
if (mat == null)
return 0;
int resMax = maxSumArr(mat[0]);
for (int i = 0;i < n;i++)
{
int tempArr [] = mat[i];
resMax = Math.max(resMax, maxSumArr(mat[i]));
for (int j = i + 1;j < n;j++)
{
for (int k = 0;k < mat[0].length;k++)
{
tempArr[k] += mat[j][k];
}
int tempSum = maxSumArr(tempArr);
resMax = Math.max(resMax,tempSum);
}
}
return resMax;
// write code here
}
public int maxSumArr(int [] array)
{
int temp = array[0];
int maxValue = temp;
for (int i = 1;i < array.length;i++)
{
temp = Math.max(array[i], temp + array[i]);
maxValue = Math.max(temp, maxValue);
}
return Math.max(maxValue,temp);
}
}