สมมติว่าเราได้รับเมทริกซ์ที่มีค่าจำนวนเต็ม เราต้องหาเมทริกซ์ย่อยจากเมทริกซ์โดยที่ผลรวมขององค์ประกอบของเมทริกซ์เท่ากับค่าผลรวมเป้าหมายที่กำหนด เราคืนค่าจำนวนเมทริกซ์ย่อย
ดังนั้นหากอินพุตเป็นแบบ
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