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

C++の交差していない行


AとBの整数を(指定された順序で)2本の別々の水平線に書き込んだとします。ここで、接続線を描くことができます。つまり、-

のように2つの数A[i]とB[j]を接続する直線です。
  • A [i] ==B [j];

  • 他の接続(非水平)線と交差しない、描画する線。

接続線は端点でも交差できないことに注意する必要があります。各番号は1つの接続線にのみ属することができます。接続線の最大数を見つけます。したがって、入力が[1,4,2]や[1,2,4]の場合、出力は2になります。

1 4 2
1 2 4

図のように2本の交差していない線を描くことができます。これは、A [1]=4からB[2]=4までの線がA[2]=2からB[1]=2までの線と交差するためです。

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

  • Solve()というメソッドを定義します。これには、i、j、配列A、配列B、および行列dp

    が必要です。
  • iが配列Aの範囲外の場合は、0を返します

  • jが配列Bの範囲外の場合は、0を返します

  • nj:=j

  • njではありません

    • njを1増やします

  • temp:=1(nj

  • ret:=max of(solve(i + 1、j、A、B、dp)and temp)+ resolve(i + 1、nj + 1、A、B、dp)

  • dp [i、j]:=retおよびreturnret

  • メインメソッドから

  • n:=Aのサイズ、m:=Bのサイズ

  • サイズnxmの行列dpを作成し、これに– 1

    を入力します。
  • 呼び出しsolve(0、0、A 、、 dp)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(int i, int j, vector <int>&A, vector <int>&B, vector <
   vector <int> >& dp){
      if(i >= A.size()) return 0;
      if(j >= B.size()) return 0;
      if(dp[i][j] != -1) return dp[i][j];
      int nj = j;
      while(nj < B.size() && B[nj] != A[i]) nj++;
      int ret = max(solve(i + 1, j, A, B, dp), (nj < B.size() ? 1 :
      0) + solve(i + 1, nj + 1, A, B, dp));
      return dp[i][j] = ret;
   }
   int maxUncrossedLines(vector<int>& A, vector<int>& B) {
      int n = A.size();
      int m = B.size();
      vector < vector <int > > dp(n, vector <int>(m, -1));
      return solve(0, 0, A, B, dp);
   }
};
main(){
   vector<int> v1 = {1,4,2};
   vector<int> v2 = {1,2,4};
   Solution ob;
   cout << (ob.maxUncrossedLines(v1, v2));
}

入力

[1,4,2]
[1,2,4]

出力

2

  1. C++で配列内のクロスラインをカウントする

    並べ替えられていない個別の要素の配列が提供されます。目標は、配列がソートされた後にクロスラインを見つけることです。クロスラインは以下のようにカウントされます- Arr []={1,2,4,3,5}以下に示すように3本の十字線があります Arr []={1,2,3,4,5}。配列はすでにソートされているため、クロスラインはありません。 挿入ソートを使用してクロスラインをカウントします。挿入ソートでは、右側の要素が左側の並べ替えられた要素に追加されます。ソートされたパーツに要素が追加されるたびに、正しい位置に移動するたびにカウントが増加します。それは、より大きいすべての

  2. C++での2本の線の交点のプログラム

    線ABに対応する点AとB、および線PQに対応する点PとQが与えられます。タスクは、これら2つの線の交点を見つけることです。 注 −点はX座標とY座標の2D平面で与えられます。 ここで、A(a1、a2)、B(b1、b2)およびC(c1、c2)、D(d1、d2)は、2つの異なる線を形成している座標であり、P(p1、p2)は交点です。 (交点の図解のためだけに) 交点を見つける方法 − 上の図を-としましょう 例 したがって、(a1、a2)、(b1、b2)、(c1、c2)、(d1、d2)を使用して、:A1 =b2 --a2B1 =a1 --b1C1 =(A1 * a1)+( B1 *