1. 程式人生 > 實用技巧 >57矩形區域不超過 K 的最大數值和(436)

57矩形區域不超過 K 的最大數值和(436)

作者: Turbo時間限制: 1S章節: 二分查詢

晚於: 2020-08-12 12:00:00後提交分數乘係數50%

截止日期: 2020-08-19 12:00:00

問題描述 :

給定一個非空二維矩陣 matrix 和一個整數 k,找到這個矩陣內部不大於 k 的最大矩形和。

示例:

輸入: matrix = [[1,0,1],[0,-2,3]], k = 2

輸出: 2

解釋: 矩形區域 [[0, 1], [-2, 3]] 的數值和是 2,且 2 是不超過 k 的最大數字(k = 2)。

說明:

矩陣內的矩形區域面積必須大於 0。

如果行數遠大於列數,你將如何解答呢?

輸入說明 :

首先輸入matrix的行數m、列數n,

然後輸入m行,每行n個整數。

最後輸入一個整數k。

輸出說明 :

輸出一個整數。

輸入範例 :

輸出範例 :

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    int maxSumSubmatrix(vector<vector<int>>& matrix, int k) 
    {
        if (matrix.empty() || matrix[0].empty()) return
0; int m = matrix.size(), n = matrix[0].size(), res = INT_MIN; int sum[m][n]; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { int t = matrix[i][j]; if (i > 0) t += sum[i - 1][j]; if (j > 0) t += sum[i][j - 1
]; if (i > 0 && j > 0) t -= sum[i - 1][j - 1]; sum[i][j] = t; for (int r = 0; r <= i; ++r) { for (int c = 0; c <= j; ++c) { int d = sum[i][j]; if (r > 0) d -= sum[r - 1][j]; if (c > 0) d -= sum[i][c - 1]; if (r > 0 && c > 0) d += sum[r - 1][c - 1]; if (d <= k) res = max(res, d); } } } } return res; } }; int main() { int m, n,data,k; vector<vector<int> > mat; cin>>m>>n; for(int i=0; i<m; i++) { vector<int> row; for(int j=0; j<n; j++) { cin>>data; row.push_back(data); } mat.push_back(row); } cin>>k; int res=Solution().maxSumSubmatrix(mat,k); cout<<res<<endl; return 0; }