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

C++でKより大きくない長方形の最大合計


2D行列と整数kがあるとします。合計がkを超えないように、行列内の長方形の最大合計を見つける必要があります。したがって、入力が-

のような場合
1 0 1
0 -3 2

また、k =3の場合、マークされた長方形の合計は3であるため、出力は3になります。

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

  • 関数maxSumSubmatrix()を定義します。これには、1つの2D配列行列とkが必要です。
  • n:=行番号、m:=列番号
  • ans:=-inf
  • 初期化l:=0の場合、l
  • サイズnの配列rowSumを定義します
  • rを初期化する場合:=l、r
  • iを初期化する場合:=0、i
  • rowSum [i]:=rowSum [i] + matrix [i、r]
  • 1セットを定義する
  • sに0を挿入
  • currSum:=0
  • iを初期化する場合:=0、i
  • currSum:=currSum + rowSum [i]
  • it:=currSum –k以下のセットの最初の要素
  • sの最後の要素と等しくない場合、-
    • ans:=ansの最大値と(currSum-it)
  • currSumをsに挿入
  • 回答を返す
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
          int n = matrix.size();
          int m = matrix[0].size();
          int ans = INT_MIN;
          for(int l = 0; l < m; l++){
             vector <int> rowSum(n);
             for(int r = l; r < m; r++){
                for(int i = 0; i < n; i++)rowSum[i] += matrix[i][r];
                set < int > s;
                s.insert(0);
                int currSum = 0;
                for(int i = 0; i < n; i++){
                   currSum += rowSum[i];
                   set <int> :: iterator it = s.lower_bound(currSum - k);
                   if(it != s.end()){
                      ans = max(ans, (currSum - *it));
                   }
                   s.insert(currSum);
                }
             }
          }
          return ans;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{1,0,1},{0,-3,2}};
       cout << (ob.maxSumSubmatrix(v, 3));
    }

    入力

    [{1,0,1},{0,-3,2}]
    3

    出力

    3

    1. C++の長方形エリアII

      (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r

    2. C++でのライン上の最大ポイント

      2D平面があるとします。同じ直線上にある点の最大数を見つける必要があります。したがって、ポイントが次のような場合- それから4つのポイントがあります これを解決するには、次の手順に従います- n:=ポイントの数、n <3の場合、nを返します ans:=2 1からn–1の範囲のiの場合 カウント:=0 インデックスiとi– 1から2つのポイントを取ります。これらは、p1、p2です。 p1ポイントとp2ポイントが同じ場合、 0からn–1の範囲のjの場合 points [j] .x=p1.xおよびpoints[j].y =p1.yの場合、