C ++
 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の場合、-
    • 次元mxnの1つの2D配列転置を定義します
    • iを初期化する場合:=0、i
    • jを初期化する場合:=0、j
    • transpose [j、i]:=mat [i、j]
  • returnsolve(transpose、sumTarget)
  • ans:=0
  • pを初期化する場合:=0、p
  • 配列の到着を定義する
  • q:=pを初期化する場合、q
  • iを初期化する場合:=0、i
  • arr [i]:=arr [i] + mat [i、q]
  • キーと値のペア{0、1}を含む1つのマップpcntを定義します
  • pref:=0
  • iを初期化する場合:=0、i
  • 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

    1. パスを作成するためにグリッドでブロックするセルの数を見つけるためのC++プログラム

      次元h*wのグリッドがあるとします。セル位置(0、0)にロボットがあり、その位置(h-1、w-1)に移動する必要があります。グリッドには、ブロックされたセルとブロックされていないセルの2種類のセルがあります。ロボットはブロックされていないセルを通過できますが、ブロックされたセルを通過することはできません。ロボットは4つの方向に進むことができます。左、右、上、下に移動できます。ただし、ロボットはセルから別のセルに任意の方向に移動する可能性があるため(前のセルを無視して)、1つのパスのみを作成し、そのパスにない他のすべてのセルをブロックする必要があります。 (0、0)から(h -1、w -1)まで

    2. Pythonのサブツリーのノード値の合計から最小値を見つけるプログラム

      すべてのノードに1からnまでの番号が付けられたツリーがあるとします。各ノードには整数値が含まれています。ここで、ツリーからエッジを削除する場合、2つのサブツリーのノード値の合計の差を最小限に抑える必要があります。そのようなサブツリー間の最小の違いを見つけて返す必要があります。ツリーはエッジのコレクションとして提供され、ノードの値も提供されます。 したがって、入力がn =6の場合、edge_list =[[1、2]、[1、3]、[2、4]、[3、5]、[3、6]]、values =[15、 25、15、55、15、65]の場合、出力は0になります。 エッジ(1,2)を削除すると、重みの