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

โปรแกรมค้นหา k โดยที่เมทริกซ์ให้มีค่าเท่ากับ k คูณ k กำลังสองใน C++


สมมติว่าเรามีเมทริกซ์ 2 มิติ เราต้องหาเมทริกซ์ย่อย k × k ที่ใหญ่ที่สุด โดยที่องค์ประกอบทั้งหมดมีค่าเท่ากัน จากนั้นจึงหาค่าของ k

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

1 1 8 3
1 5 5 5
2 5 5 5
4 5 5 5

จากนั้นผลลัพธ์จะเป็น 3 เนื่องจากมีเมทริกซ์กำลังสอง 3 × 3 ของค่า 5

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • n :=จำนวนแถวของเมทริกซ์

  • m :=จำนวนคอลัมน์ของเมทริกซ์

  • กำหนดขนาดอาร์เรย์ 2 มิติหนึ่ง dp (n x m) และเติมด้วย 1

  • ยกเลิก :=1

  • สำหรับการเริ่มต้น i :=n - 1 เมื่อ i>=0, อัปเดต (ลด i โดย 1) ให้ทำ -

    • สำหรับการเริ่มต้น j :=m - 1 เมื่อ j>=0, อัปเดต (ลด j โดย 1) ให้ทำ -

      • val :=inf

      • ถ้า i + 1

        • val :=ต่ำสุดของ dp[i + 1, j] และ val

      • มิฉะนั้น

        • ค่า :=0

      • ถ้า j + 1

        • val :=ค่าต่ำสุดของ dp[i, j + 1] และ val

      • มิฉะนั้น

        • ค่า :=0

      • ถ้า i + 1

        • val :=ต่ำสุดของ dp[i + 1, j + 1] และ val

      • มิฉะนั้น

        • ค่า :=0

      • ถ้า val เหมือนกับ inf แล้ว −

        • ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป

      • dp[i, j] :=dp[i, j] + วาล

        • ret :=สูงสุดของ ret และ dp[i, j]

  • รีเทิร์น

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(vector<vector<int>>& v) {
      int n = v.size();
      int m = v[0].size();
      vector<vector<int>> dp(n, vector<int>(m, 1));
      int ret = 1;
      for (int i = n - 1; i >= 0; i--) {
         for (int j = m - 1; j >= 0; j--) {
            int val = INT_MAX;
            if (i + 1 < n && v[i + 1][j] == v[i][j]) {
               val = min(dp[i + 1][j], val);
            }
            else {
               val = 0;
            }
            if (j + 1 < m && v[i][j + 1] == v[i][j]) {
               val = min(dp[i][j + 1], val);
            }
            else {
               val = 0;
            }
            if (i + 1 < n && j + 1 < m && v[i + 1][j + 1] == v[i][j]) {
               val = min(dp[i + 1][j + 1], val);
            }
            else {
               val = 0;
            }
            if (val == INT_MAX)
               continue;
               dp[i][j] += val;
               ret = max(ret, dp[i][j]);
            }
         }
         return ret;
      }
};
int solve(vector<vector<int>>& matrix) {
   return (new Solution())->solve(matrix);
}
int main(){
   vector<vector<int>> matrix = {
      {1, 1, 8, 3},
      {1, 5, 5, 5},
      {2, 5, 5, 5},
      {4, 5, 5, 5}
   };
   cout << solve(matrix);
}

อินพุต

{ {1, 1, 8, 3}, {1, 5, 5, 5}, {2, 5, 5, 5}, {4, 5, 5,
5} };

ผลลัพธ์

3