Giả sử chúng ta có một ma trận nhị phân 2d, chúng ta phải tìm tổng số ma trận con có tất cả 1 s.
Vì vậy, nếu đầu vào giống như
1 | 1 | 0 |
1 | 1 | 0 |
0 | 0 | 1 |
thì đầu ra sẽ là 10, vì có năm ma trận 1 x 1, hai ma trận 2 x 1. hai ma trận 1 x 2. Và một ma trận 2 x 2.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một hàm getAns (), điều này sẽ nhận một mảng a,
-
ret:=0
-
n:=kích thước của một
-
Xác định một mảng v có kích thước n
-
Xác định một ngăn xếp
-
để khởi tạo i:=0, khi i
-
while (st không trống và là [phần tử trên cùng của st]> =a [i]), do -
-
bật từ st
-
-
nếu st không trống, thì -
-
trước:=phần tử hàng đầu của st
-
v [i]:=v [i] + v [trước]
-
v [i]:=v [i] + a [i] * (i - trước)
-
-
Nếu không
-
v [i]:=v [i] + a [i] * (i + 1)
-
-
chèn tôi vào st
-
-
cho mỗi tôi trong v -
-
ret:=ret + i
-
-
trả lại ret
-
Từ phương thức chính, thực hiện như sau -
-
ret:=0
-
n:=kích thước của v
-
m:=(nếu n khác 0 thì kích thước của v [0], ngược lại là 0)
-
Xác định nhiệt độ mảng có kích thước m
-
để khởi tạo i:=0, khi i
-
để khởi tạo j:=0, khi j
-
temp [j]:=(nếu v [i, j] khác 0 thì temp [j] + 1, nếu không thì 0)
-
-
ret:=ret + getAns (tạm thời)
-
-
trả lại ret
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <bits/stdc++.h> using namespace std; class Solution { public: int getAns(vector& a) { int ret = 0; int n = a.size(); vector<int> v(n); stack<int> st; for (int i = 0; i < a.size(); i++) { while (!st.empty() && a[st.top()] >= a[i]) st.pop(); if(!st.empty()) { int prev = st.top(); v[i] += v[prev]; v[i] += a[i] * (i - prev); } else{ v[i] += a[i] * (i + 1); } st.push(i); } for (int i : v) { ret += i; } return ret; } int solve(vector<vector<int>>& v) { int ret = 0; int n = v.size(); int m = n ? v[0].size() : 0; vector<int> temp(m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { temp[j] = v[i][j] ? temp[j] + 1 : 0; } ret += getAns(temp); } return ret; } }; int solve(vector<vector<int>>& matrix) { return (new Solution())->solve(matrix); } main(){ vector<vector> matrix = { {1, 1, 0}, {1, 1, 0}, {0, 0, 1} }; cout << solve(matrix); }
Đầu vào
{{1, 1, 0},{1, 1, 0},{0, 0, 1}};
Đầu ra
10