C++の特定の2D配列の最小合計部分行列
行列を形成する整数要素の2次元配列が与えられます。タスクは、そのように形成された行列から部分行列を引き出すことによって、最小合計のカウントを計算することです。
このためのさまざまな入出力シナリオを見てみましょう-
で- int matrix [size] [size] ={{2、3、-1、5}、{-2、9、-1、6}、{5、6、9、-9}、{-6、1 1、1}}
アウト- 特定の2D配列の最小和部分行列は次のとおりです。-9
説明- サイズ4x4、つまり4行4列の2次元配列が与えられます。ここで、最小の部分行列が-9になるように、与えられた行列から部分行列を見つけます。
In − int matrix [row] [column] ={{4、1、3}、{-1、-1、-1}、{6、2、3}}
アウト- 特定の2D配列の最小合計部分行列は次のとおりです。-3
説明- サイズ3x3、つまり3行3列の2次元配列が与えられます。ここで、与えられた行列からサブ行列を見つけます。これは、与えられた行列の2番目の行で達成される最小の部分行列が-3であり、部分行列のサイズが1x3、つまり1行3列になります。
以下のプログラムで使用されるアプローチは次のとおりです-
-
整数の2次元配列を入力し、さらに処理するためにデータを関数Minimum_Matrix(matrix)に渡します。
-
関数Minimum_Matrix(matrix)
の内部-
一時変数をintresult=INT_MAX、int arr [row]、int total、int first、intendとして宣言します。
-
ループFORをintからtempまで、tempがcolumn未満になるまで開始します。ループ内で配列要素を0に設定します。別のループFORを、intからtemp_2まで、temp_2がcolumnより小さくなるまで開始します。ループ内で、iがrow未満になるまで、int iから0まで別のループを開始し、arr[i]をar[i] + matrix[i][temo_2]として設定します。
-
関数Algo_Kad(arr、&first、&end、row)の呼び出しとしてtotalを設定します
-
合計が結果よりも小さいかどうかを確認してから、結果を合計として設定します
-
結果を最終出力として印刷します。
-
-
関数内intAlgo_Kad(int * arr、int * first、int * end、int max_size)
-
一時変数を、int totalを0、int resultをINT_MAX、int tempを0、* end =-1
として宣言します。 -
iがmax_size未満になるまで、ループFORをiから0まで開始します。ループ内で、totalをtotal +arr[i]として設定します。
-
IFの合計が0より大きいことを確認してから、合計を0に設定し、温度をi+1に設定します。
-
それ以外の場合は、結果よりも合計が少ないことを確認してから、結果を合計に設定し、*最初に一時的に、*終了してi
-
ここで、IF * endが-1に等しくないことを確認してから、結果を返します。
-
結果をarr[0]に設定し、* firstを0に、*endを0に設定します
-
iからmax_size未満になるまでループFORを開始します。ループ内で、結果よりも小さいIF arr [i]をチェックしてから、結果をarr [i]として設定し、*最初はiとして、*endはi
として設定します。 -
結果を返します。
-
例
#include <bits/stdc++.h> using namespace std; #define row 4 #define column 4 int Algo_Kad(int* arr, int* first, int* end, int max_size) { int total = 0; int result = INT_MAX; int temp = 0; *end = -1; for(int i = 0; i < max_size; ++i) { total = total + arr[i]; if(total > 0) { total = 0; temp = i + 1; } else if(total < result) { result = total; *first = temp; *end = i; } } if(*end != -1) { return result; } result = arr[0]; *first = 0; *end = 0; for(int i = 1; i < max_size; i++) { if(arr[i] < result) { result = arr[i]; *first = i; *end = i; } } return result; } void Minimum_Matrix(int matrix[][column]) { int result = INT_MAX; int arr[row]; int total; int first; int end; for(int temp = 0; temp < column; ++temp) { memset(arr, 0, sizeof(arr)); for(int temp_2 = temp; temp_2 < column; ++temp_2) { for(int i = 0; i < row; ++i) { arr[i] = arr[i] + matrix[i][temp_2]; } total = Algo_Kad(arr, &first, &end, row); if(total < result) { result = total; } } } cout<<"Minimum sum submatrix in a given 2D array is: "<<result; } int main() { int matrix[row][column] = {{2, 3, -1, 5}, {-2, 9, -1, 6}, { 5, 6, 9, -9}, { -6, 1, 1, 1} }; Minimum_Matrix(matrix); return 0; }
出力
上記のコードを実行すると、次の出力が生成されます
Minimum sum submatrix in a given 2D array is: -9
-
C++で互いに素な配列を作成するための最小限の挿入
このセクションでは、別の興味深い問題が発生します。 N個の要素の配列があるとします。この配列を互いに素な配列にするためには、交点の最小数を見つける必要があります。互いに素な配列では、2つの連続する要素ごとのgcdは1です。配列も印刷する必要があります。 {5、10、20}のような要素があるとします。これは互いに素な配列ではありません。ここで、5、10、10、20の間に1を挿入すると、互いに素な配列になります。したがって、配列は{5、1、10、1、20}のようになります。 アルゴリズム makeCoPrime(arr, n): begin count := 0 &nb
-
C ++の合計配列パズル?
ここでは、配列に関連する1つの興味深い問題を確認します。 n個の要素を持つ配列があります。 n個の要素の別の配列を作成する必要があります。ただし、2番目の配列のi番目の位置は、i番目の要素を除く最初の配列のすべての要素の合計を保持します。そして、1つの制約は、この問題では減算演算子を使用できないことです。 減算演算を使用できれば、すべての要素の合計を取得し、最初の配列のi番目の要素を減算して、2番目の配列のi番目の場所に格納することで、この問題を簡単に解決できます。 ここでは、毎回要素を追加することでこれを解決し、0..n-1のiについては、位置iの要素を無視します。ポイントを得るためのア