Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมหาจำนวนเมทริกซ์ย่อยจากเมทริกซ์ที่ผลรวมของอิลิเมนต์เท่ากับค่าที่กำหนดใน C++


สมมติว่าเราได้รับเมทริกซ์ที่มีค่าจำนวนเต็ม เราต้องหาเมทริกซ์ย่อยจากเมทริกซ์โดยที่ผลรวมขององค์ประกอบของเมทริกซ์เท่ากับค่าผลรวมเป้าหมายที่กำหนด เราคืนค่าจำนวนเมทริกซ์ย่อย

ดังนั้นหากอินพุตเป็นแบบ

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]
  • ผลตอบแทนแก้(transpose, sumTarget)
  • ตอบ :=0
  • สำหรับการเริ่มต้น p :=0 เมื่อ p
  • กำหนดอาร์เรย์ arr
  • สำหรับการเริ่มต้น q :=p เมื่อ q
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • arr[i] :=arr[i] + mat[i, q]
  • กำหนดหนึ่งแผนที่ pcnt ที่มีคู่คีย์-ค่า {0, 1}
  • pref :=0
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • pref :=pref + arr[i]
  • tmp :=ตำแหน่งที่ (pref - sumTarget) อยู่ใน pcnt
  • ถ้า tmp ไม่เท่ากับตำแหน่งสิ้นสุดของ pcnt แล้ว −
    • (เพิ่ม 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