01矩阵问题
01矩陣問題
文章目錄
- 01矩陣問題
- 一、問題描述
- 二、分析
- 三、代碼
- 四、問題描述
- 五、代碼
- 六.問題描述
- 七、代碼
一、問題描述
求N* M矩陣中子矩陣的最大元素和
二、分析
- 先計算出以左上角的元素(1,1)和當前元素(i,j)為頂點對的子矩陣的部分和,部分和的計算如下
- 假設已經確定了矩陣區域的上下邊界,不如知道矩陣區域的上下邊界分布是第a行和第c行,接下來要確定左右邊界。
- 我們把第a行和第c行之間的每一列看成一個整體,相當于一維數組中的一個元素(通過子矩陣部分和可以在O(1)時間內計算出整體之和)。
三、代碼
#include <iostream> #include <algorithm> #define MAXN 1003 using namespace std; int A[MAXN][MAXN]; long long PS[MAXN][MAXN]; inline long long MatrixSum(int s, int t, int i, int j) { return PS[i][j] - PS[i][t - 1] - PS[s - 1][j] + PS[s - 1][t - 1]; } int main() { int m, n, i, j; cin >> n >> m; for (i = 1; i <= n; i++) for (j = 1; j <= m; j++) cin >> A[i][j];for (i = 0; i <= n; i++) PS[i][0] = 0; for (j = 0; j <= m; j++) PS[0][j] = 0; // 計算矩陣的部分和 for (i = 1; i <= n; i++) for (j = 1; j <= m; j++) PS[i][j] = A[i][j] + PS[i - 1][j] + PS[i][j - 1] - PS[i - 1][j - 1];int a, c; long long All = A[1][1]; for (a = 1; a <= n; a++) for (c = a; c <= n; c++) { // 將子矩陣上下邊界設為第a行和第c行,在這些子矩陣中取最大值 long long Tail = MatrixSum(a, 1, c, 1); for (j = 2; j <= m; j++) { Tail = max(MatrixSum(a, j, c, j), MatrixSum(a, j, c, j)+Tail); All = max(Tail, All); } } cout << All; }四、問題描述
找到整數矩陣matrix中,元素之和最大的n行m列的子矩陣的元素之和
五、代碼
int maxSubmatrixSum(std::vector<std::vector<int>> matrix,int n, int m) { int base_sum = 0; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ base_sum += matrix[i][j]; } } int result = 0; for (int i = 0; i + n - 1 < matrix.size(); i++) { if(i > 0){ for (int y = 0; y < m; y++){ base_sum += matrix[i + n - 1][y] - matrix[i - 1][y]; } } int real_sum = base_sum; if (real_sum > result) { result = real_sum; } for (int j = 0; j + m < matrix[i].size(); j++) { for (int x = i; x < i + n; x++) { real_sum += matrix[x][j + m] - matrix[x][j]; } if (real_sum > result) { result = real_sum; } } } return result; }六.問題描述
七、代碼
class Solution { public:int maximalRectangle(vector<vector<char>>& matrix) {if(matrix.empty()){return 0;}vector<vector<int>> dp(matrix.size(),vector<int>(matrix[0].size(),0));for(int i = 0;i < matrix.size();i++){for(int j = 0;j < matrix[0].size();j++){if(j == 0){if(matrix[i][0] == '0')dp[i][j] = 0;else dp[i][j] = 1;}else if(matrix[i][j] == '1'){dp[i][j] = dp[i][j - 1] + 1;}else {dp[i][j] = 0;}}}int ret = INT_MIN;for(int i = 0;i < matrix.size();i++){for(int j = 0;j < matrix[0].size();j++){int col = 0;int row = INT_MAX;for(int k = i;k >= 0;k--){if(dp[k][j] == 0){row = INT_MAX;col = 0;continue;}row = min(dp[k][j],row);col++;ret = max(ret,row * col);}ret = max(ret,row * col);}}return ret;} };詳解請點擊:https://blog.csdn.net/wolfGuiDao/article/details/107537331
總結