C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

与えられた行列がC++で同じ値のk×kの2乗を持つkを見つけるプログラム


2d行列があるとすると、すべての要素に同じ値が含まれている最大のk×k部分行列を見つけてから、kの値を見つける必要があります。

したがって、入力が次のような場合

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

値5の3×3の正方行列があるため、出力は3になります。

これを解決するには、次の手順に従います-

  • n:=行列の行数

  • m:=行列の列数

  • サイズ(n x m)の2D配列dpを1つ定義し、1で埋めます

  • ret:=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

      • それ以外の場合

        • val:=0

      • j + 1

        • val:=最小のdp [i、j+1]およびval

      • それ以外の場合

        • val:=0

      • i +1

        • val:=最小のdp [i + 1、j+1]およびval

      • それ以外の場合

        • val:=0

      • valがinfと同じ場合、-

        • 次の部分を無視し、次の反復にスキップします

      • dp [i、j]:=dp [i、j] + val

        • ret:=retとdp[i、j]

          の最大値
  • retを返す

理解を深めるために、次の実装を見てみましょう-

#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

  1. Pythonの特定の行列で1の最大の正方形の領域を見つけるプログラム

    バイナリ行列があるとすると、その与えられた行列で1の最大の2乗を見つける必要があります。 したがって、入力が次のような場合 1 0 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 その場合、出力は16

  2. Pythonで指定されたマトリックス内または非中のターゲット値を見つけるプログラム

    各行と列が降順ではない順序で並べ替えられている2Dマトリックスがあるとすると、指定されたターゲットがその中に存在するかどうかを確認する必要があります。 したがって、入力が次のような場合 2 4 30 3 4 31 6 6 32 そしてtarget=31の場合、出力はTrueになります これを解決するには、次の手順に従います- col:=マトリックスの列サイズ-1 行列の0から行サイズの範囲のiの場合、 =0の場合、do col:=col-1 matrix [i、col]がターゲットと同じ場合、 Trueを返す