最大和子矩陣

一道經典的動態規劃問題:最大和子矩陣
有一個正整數和負整數組成的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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章