मान लीजिए कि हमें एक मैट्रिक्स दिया गया है जिसमें पूर्णांक मान हैं। हमें मैट्रिक्स से सबमैट्रिस का पता लगाना है जहां मैट्रिक्स के तत्वों का योग दिए गए लक्ष्य योग मान के बराबर है। हम सबमैट्रिस की संख्या लौटाते हैं।
तो, अगर इनपुट पसंद है
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 1 | 0 | 1 |
और लक्ष्य =5, तो आउटपुट 3 होगा।
सबमैट्रिस की संख्या जिनके तत्वों का योग 6 के बराबर है, 2 है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- n :=चटाई का आकार
- m :=(यदि n 0 के समान है, तो 0, अन्यथा चटाई का आकार[0])
- यदि m> n, तो −
- m x n आयामों के एक 2D सरणी स्थानान्तरण को परिभाषित करें
- इनिशियलाइज़ i :=0 के लिए, जब i
करें - इनिशियलाइज़ j :=0 के लिए, जब j
करें - स्थानांतरित करें[j, i] :=mat[i, j]
- इनिशियलाइज़ j :=0 के लिए, जब j
- (पीसीएनटी [pref] 1 से बढ़ाएं)
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include<bits/stdc++.h> using namespace std; int solve(vector<vector<int>>& mat, int sumTarget) { int n = mat.size(); int m = n == 0 ? 0 : mat[0].size(); if (m > n) { vector<vector<int>> transpose(m, vector<int>(n)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { transpose[j][i] = mat[i][j]; } } return solve(transpose, sumTarget); } int ans = 0; for (int p = 0; p < m; p++) { vector<int> arr(n); for (int q = p; q < m; q++) { for (int i = 0; i < n; i++) { arr[i] += mat[i][q]; } unordered_map<int, int> pcnt = {{0, 1}}; int pref = 0; for (int i = 0; i < n; i++) { pref += arr[i]; auto tmp = pcnt.find(pref - sumTarget); if (tmp != end(pcnt)) ans += tmp->second; pcnt[pref]++; } } } return ans; } int main() { vector<vector<int>> mat = {{0, 0, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 1}, {1, 1, 0, 1}}; cout<< solve(mat, 5) <<endl; return 0; }
इनपुट
{{0, 0, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 1}, {1, 1, 0, 1}}, 5
आउटपुट
3