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

C++でマトリックスを反転した後のスコア


各値が0または1である2次元行列Aがあるとします。ここでの移動は、任意の行または列を選択し、その行または列の各値を切り替えることで構成されます。つまり、すべて0を1に、すべて1を0に変更します。これで、任意の数の移動を行った後、このマトリックスのすべての行が2進数として解釈され、マトリックスのスコアはこれらの数値の合計になります。したがって、私たちのタスクは、可能な限り最高のスコアを見つけることです。入力が-

のような場合
0 0 1 1
1 0 1 0
1 1 0 0

トグル後の出力は39になり、行列は-

になります。
1 1 1 1
1 0 0 1
1 1 1 1

したがって、数値は15 + 9 + 15 =39

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

  • n:=行数およびm:=列数

  • ret:=n x(2 ^(m – 1))

  • 1からm–1の範囲のjの場合

    • cnt:=0

    • 0からn–1の範囲のiの場合

      • cnt:=cnt + A [i、j] =A [i、0]

    • temp:=2 ^(m – j – 1)*cntおよびn–cntの最大値

    • ret:=ret + temp

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int matrixScore(vector<vector<int>>& A) {
      int n = A.size();
      int m = A[0].size();
      int ret = (1 << (m - 1)) * n;
      for(int j = 1; j < m; j++){
         int cnt = 0;
         for(int i = 0; i < n; i++){
            cnt += (A[i][j] == A[i][0]);
         }
         int temp = ((1 << (m - (j + 1))) * max(cnt, n - cnt));
         ret += temp;
      }
      return ret;
   }
};
main(){
   vector<vector<int>> v = {{0,0,1,1},{1,0,1,0},{1,1,0,0}};
   Solution ob;
   cout << (ob.matrixScore(v));
}

入力

[[0,0,1,1],[1,0,1,0],[1,1,0,0]]

出力

39

  1. C++での行列の行方向と列方向のトラバーサル

    マトリックスは2つの方法でトラバースできます。行マイズトラバーサルは、最初の行から2番目、というように最後の行まで、各行を1つずつ訪問します。行の要素は、インデックス0から最後のインデックスまで返されます。 列ごとのトラバーサルでは、要素は最初の列から最後の列に順番にトラバースされます。 2DマトリックスではM[i][j]。インデックスiは行を表すために使用され、インデックスjは列を表すために使用されます。行ごとのトラバーサルの場合は、から開始します。 i=0行目および0<=j<最後のインデックス i=1行目および0<=j<最後のインデックス ..... i=最後の行と0<=j<

  2. C++でのT秒後のカエルの位置

    n個の頂点で構成される無向ツリーが1つあるとします。頂点には1からnまでの番号が付けられています。これで、カエルは頂点1からジャンプを開始します。カエルは、現在の頂点から、訪問していない別の頂点に隣接している場合、1秒でジャンプできます。カエルは、訪れた頂点に戻ることはできません。カエルが複数の頂点にジャンプできる場合は、そのうちの1つにランダムにジャンプします 確率が同じ場合、それ以外の場合、カエルが訪問していない頂点にジャンプできない場合、同じ頂点で永久にジャンプします。 ツリーはエッジの配列として与えられます。 t秒後にカエルが頂点ターゲットにいる確率を見つける必要があります。 し