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

C++での最長の等差数列


整数の配列Aがあるとすると、Aの最長の算術サブシーケンスの長さを返す必要があります。AのサブシーケンスはリストA [i_1]、A [i_2]、...、A[です。 i_k] with 0 <=i_1

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

  • マップを作成しますdp、n:=Aのサイズ、設定ret:=2

  • 0からn–1の範囲のiの場合

    • 0からi–1の範囲のjの場合

      • diff:=A [j] – A [i]

      • dp [i、diff]:=1 + dp [j、diff]

      • ret:=最大1 + dp [i、diff]およびret

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int longestArithSeqLength(vector<int>& A) {
      unordered_map <int, unordered_map <int, int> > dp;
      int n = A.size();
      int ret = 2;
      for(int i = 0; i < n; i++){
         for(int j = 0; j < i; j++){
            int diff = A[j] - A[i];
            dp[i][diff] = 1 + dp[j][diff];
            ret = max(1 + dp[i][diff], ret);
         }
      }
      return ret;
   }
};
main(){
   vector<int> v1 = {9,4,7,2,10};
   Solution ob;
   cout << (ob.longestArithSeqLength(v1));
}

入力

[9,4,7,2,10]

出力

3

  1. C++での二分木最長連続シーケンス

    二分木があるとしましょう。連続する最長のシーケンスパスの長さを見つけることができるかどうかを確認する必要があります。パスが、親子接続に沿ったツリー内の開始ノードから任意のノードまでのノードのシーケンスを参照している場合。最長の連続パスは、親から子をたどる必要がありますが、逆にする必要はありません。 したがって、入力が次のような場合、 最長の連続シーケンスパスは3-4-5であるため、出力は3になります。したがって、3を返します。 これを解決するには、次の手順に従います- 関数solveUtil()を定義します。これにより、ノード、prev、lenが1で初期化されます。 ノ

  2. 与えられたシーケンスの最長増加部分列を見つけるためのC++プログラム

    最長増加部分列は、1つの項目が前の項目よりも大きい部分列です。 ここでは、整数のセットから最長増加部分列の長さを見つけようとします。 Input: A set of integers. {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15} Output: The length of longest increasing subsequence. Here it is 6. The subsequence is 0, 2, 6, 9, 13, 15. アルゴリズム longestSubSeq(subarray、n) 入力 :サブ配列と