สมมติว่าเราได้รับเมทริกซ์ที่มีค่าจำนวนเต็ม เราต้องหาเมทริกซ์ย่อยจากเมทริกซ์โดยที่ผลรวมขององค์ประกอบของเมทริกซ์เท่ากับค่าผลรวมเป้าหมายที่กำหนด เราคืนค่าจำนวนเมทริกซ์ย่อย
ดังนั้นหากอินพุตเป็นแบบ
| 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, มิฉะนั้น ขนาดของ mat[0])
- ถ้า m> n แล้ว −
- กำหนดอาร์เรย์ 2 มิติหนึ่งทรานสโพสของมิติ m x n
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- สำหรับการเริ่มต้น j :=0 เมื่อ j
- ย้าย[j, i] :=mat[i, j]
- สำหรับการเริ่มต้น j :=0 เมื่อ j
- (เพิ่ม pcnt[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