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

C++で指定されたマトリックスの任意のサブマトリックスで可能な最大トレース


この問題では、2次元配列arr[][]が与えられます。私たちのタスクは、C++で指定されたマトリックスの任意のサブマトリックスに対して可能な最大トレースを見つけるプログラムを作成することです。

問題の説明

サブマトリックスの最大トレースを見つける必要があります。トレースは、行列の主対角線の要素の合計です。

問題を理解するために例を見てみましょう

入力

arr[][] ={{-2, 5, 3},
          {1, 6, 2},
          {4, 3, 9}}

出力

15

説明

For the sub-array: {1, 6}
{9, 3}

ソリューションアプローチ

簡単な解決策は、2次元配列の主対角線の要素を使用して最大合計を見つけることです。トレースは、サブアレイの最大合計によって与えられます。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
#define row 3
#define col 3

int CalcMaxTraceSubMat(int mat[row][col]){
   int maxtraceSum = 0, r, c, traceSum;
   for (int i = 0; i < row; i++){
      for (int j = 0; j < col; j++){
         r = i, c = j, traceSum = 0;
         while (r < row && c < col){
            traceSum += mat[r][c];
            r++;
            c++;
            maxtraceSum = max(traceSum, maxtraceSum);
         }
      }
   }
   return maxtraceSum;
}
int main() {
   int mat[row][col] = { {-2, 5, 6},
                        {1, 6, 2},
                        {4, 3, 9} };

   cout<<"The maximum trace possible for any submatrix is "<<CalcMaxTraceSubMat(mat);
   return 0;
}

出力

The maximum trace possible for any submatrix is 15

  1. C++で指定された行列の1の正方形のサブ行列の数を数えるプログラム

    2次元のバイナリ行列があるとすると、すべて1の部分行列の総数を見つける必要があります。 したがって、入力が次のような場合 1 1 0 1 1 0 0 0 1 その場合、出力は10になります。これは、1 x 1行列が5つ、2x1行列が2つあるためです。 2つの1x2行列。そして、1つの2x2マトリックス。 これを解決するには、次の手順に従います- 関数getAns()を定義します。これは、配列a、を取ります。 ret:=0 n:=aのサイズ サイズnの配列vを定義します 1つのスタックstを定義する

  2. C++のグリッドで指定された方向に可能な移動をカウントします

    サイズnxmのグリッドと開始点x、yを表す2つの変数nとmです。 また、移動((1,1)、(2,2))などとしてグリッド内を移動するために実行できるステップ/移動のペアも指定されます。移動の各ペアは、x、y軸で実行されるステップの単位を表します。目標は、境界[1、n] X [1、m]内のグリッド内をトラバースするために実行できる合計ステップを見つけることです。nが5、mが4、現在の位置が2、2で、選択されたステップが( 1、-1)次に、このステップを1回実行すると、(3,1)になります。このステップを再度実行すると、(4、-1)になります。これは、-1が範囲外であるため無効です。 例