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
-
C++での行列の行方向と列方向のトラバーサル
マトリックスは2つの方法でトラバースできます。行マイズトラバーサルは、最初の行から2番目、というように最後の行まで、各行を1つずつ訪問します。行の要素は、インデックス0から最後のインデックスまで返されます。 列ごとのトラバーサルでは、要素は最初の列から最後の列に順番にトラバースされます。 2DマトリックスではM[i][j]。インデックスiは行を表すために使用され、インデックスjは列を表すために使用されます。行ごとのトラバーサルの場合は、から開始します。 i=0行目および0<=j<最後のインデックス i=1行目および0<=j<最後のインデックス ..... i=最後の行と0<=j<
-
C++でのT秒後のカエルの位置
n個の頂点で構成される無向ツリーが1つあるとします。頂点には1からnまでの番号が付けられています。これで、カエルは頂点1からジャンプを開始します。カエルは、現在の頂点から、訪問していない別の頂点に隣接している場合、1秒でジャンプできます。カエルは、訪れた頂点に戻ることはできません。カエルが複数の頂点にジャンプできる場合は、そのうちの1つにランダムにジャンプします 確率が同じ場合、それ以外の場合、カエルが訪問していない頂点にジャンプできない場合、同じ頂点で永久にジャンプします。 ツリーはエッジの配列として与えられます。 t秒後にカエルが頂点ターゲットにいる確率を見つける必要があります。 し