ホームページ バックエンド開発 C++ C++ で最長増加サブシーケンス アルゴリズムを使用する方法

C++ で最長増加サブシーケンス アルゴリズムを使用する方法

Sep 19, 2023 pm 05:21 PM
c++ アルゴリズム 最長の増加部分列

C++ で最長増加サブシーケンス アルゴリズムを使用する方法

C で最長増加部分列アルゴリズムを使用する方法には、特定のコード例が必要です。

最長増加部分列 (LIS) は古典的なアルゴリズムの問​​題であり、解決策のアイデアは次のとおりです。データ処理、グラフ理論などの多くの分野に応用されています。この記事では、C での最長増加部分列アルゴリズムの使用方法と具体的なコード例を紹介します。

まず、最長増加部分列の定義を理解しましょう。シーケンス a1、a2、…、an が与えられた場合、元のシーケンス内の b の要素の相対順序が増加している最長のサブシーケンス b1、b2、…、bm を見つける必要があります。つまり、任意の i ai が満たされる場合、b には bj > bi も存在します。最長の増加部分列の長さは m です。

次に、最長増加部分列を解くための 2 つの一般的なアルゴリズム、動的計画法アルゴリズムと貪欲アルゴリズムを紹介します。

  1. 動的計画法アルゴリズム

動的計画法アルゴリズムは、最長増加部分列の解法プロセスを複数の段階に分割し、結果を 2 次元配列 dp に格納します。 dp[i] は、シーケンス内の i 番目の要素で終わる最長の増加サブシーケンスの長さを表します。

具体的な解決プロセスは次のとおりです。

  • dp 配列のすべての要素を 1 に初期化します。これは、各要素で終わるサブシーケンスの長さが少なくとも 1 であることを意味します。
  • シーケンス全体を左から右にトラバースし、位置 i ごとに dp[i] の値を計算します。
  • 各位置 i について、その前の位置 j をトラバースします。aj

最終結果は、dp 配列の最大値です。

次は、C を使用して動的プログラミング アルゴリズムを実装するコード例です。

#include<iostream>
#include<vector>
using namespace std;

int longestIncreasingSubsequence(vector<int>& nums) {
  int n = nums.size();
  vector<int> dp(n, 1);

  for (int i = 1; i < n; i++) {
    for (int j = 0; j < i; j++) {
      if (nums[j] < nums[i]) {
        dp[i] = max(dp[i], dp[j]+1);
      }
    }
  }

  int res = 0;
  for (int i = 0; i < n; i++) {
    res = max(res, dp[i]);
  }

  return res;
}

int main() {
  vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18};
  int res = longestIncreasingSubsequence(nums);
  cout << "最长递增子序列的长度为:" << res << endl;
  return 0;
}
ログイン後にコピー
  1. 貪欲アルゴリズム

貪欲アルゴリズムは、より効率的な方法です。最長の問題を解決する 後続問題を増やす方法。このアルゴリズムは、補助配列 d を使用して、現在の最長増加サブシーケンスの最後の要素を保存します。シーケンス全体をトラバースし、要素ごとに二分探索を使用して補助配列 d 内の位置を決定します。

具体的な解決プロセスは次のとおりです。

  • 補助配列 d を空の配列として初期化します。
  • シーケンス全体を左から右にたどって、要素 a ごとに、a が d の最後の要素より大きい場合は、d の最後に a を追加します。
  • a が d の最後の要素以下の場合、二分探索を使用して d 内の a 以上の最初の要素を見つけ、それを a に置き換えます。

最終結果は、補助配列 d の長さになります。

以下は、C で貪欲アルゴリズムを実装するコード例です。

#include<iostream>
#include<vector>
using namespace std;

int longestIncreasingSubsequence(vector<int>& nums) {
  vector<int> d;

  for (auto num : nums) {
    int left = 0, right = d.size() - 1;
    while (left <= right) {
      int mid = left + (right - left) / 2;
      if (d[mid] < num) {
        left = mid + 1;
      } else {
        right = mid - 1;
      }
    }
    if (left >= d.size()) {
      d.push_back(num);
    } else {
      d[left] = num;
    }
  }

  return d.size();
}

int main() {
  vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18};
  int res = longestIncreasingSubsequence(nums);
  cout << "最长递增子序列的长度为:" << res << endl;
  return 0;
}
ログイン後にコピー

上記は、C で最長増加サブシーケンス アルゴリズムを使用する方法の紹介とコード例です。動的計画法アルゴリズムであっても貪欲アルゴリズムであっても、O(n^2) または O(nlogn) の時間計算量で最長増加部分列問題を解くことができます。読者は、特定のアプリケーション シナリオに基づいて、使用する適切なアルゴリズムを選択できます。この記事が、最長増加部分列アルゴリズムを誰もが理解するのに役立つことを願っています。

以上がC++ で最長増加サブシーケンス アルゴリズムを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

改良された検出アルゴリズム: 高解像度の光学式リモートセンシング画像でのターゲット検出用 改良された検出アルゴリズム: 高解像度の光学式リモートセンシング画像でのターゲット検出用 Jun 06, 2024 pm 12:33 PM

01 今後の概要 現時点では、検出効率と検出結果の適切なバランスを実現することが困難です。我々は、光学リモートセンシング画像におけるターゲット検出ネットワークの効果を向上させるために、多層特徴ピラミッド、マルチ検出ヘッド戦略、およびハイブリッドアテンションモジュールを使用して、高解像度光学リモートセンシング画像におけるターゲット検出のための強化されたYOLOv5アルゴリズムを開発しました。 SIMD データセットによると、新しいアルゴリズムの mAP は YOLOv5 より 2.2%、YOLOX より 8.48% 優れており、検出結果と速度のバランスがより優れています。 02 背景と動機 リモート センシング技術の急速な発展に伴い、航空機、自動車、建物など、地表上の多くの物体を記述するために高解像度の光学式リモート センシング画像が使用されています。リモートセンシング画像の判読における物体検出

C++ で戦略デザイン パターンを実装するにはどうすればよいですか? C++ で戦略デザイン パターンを実装するにはどうすればよいですか? Jun 06, 2024 pm 04:16 PM

C++ でストラテジ パターンを実装する手順は次のとおりです。ストラテジ インターフェイスを定義し、実行する必要があるメソッドを宣言します。特定の戦略クラスを作成し、それぞれインターフェイスを実装し、さまざまなアルゴリズムを提供します。コンテキスト クラスを使用して、具体的な戦略クラスへの参照を保持し、それを通じて操作を実行します。

C++ でネストされた例外処理を実装するにはどうすればよいですか? C++ でネストされた例外処理を実装するにはどうすればよいですか? Jun 05, 2024 pm 09:15 PM

ネストされた例外処理は、ネストされた try-catch ブロックを通じて C++ に実装され、例外ハンドラー内で新しい例外を発生させることができます。ネストされた try-catch ステップは次のとおりです。 1. 外側の try-catch ブロックは、内側の例外ハンドラーによってスローされた例外を含むすべての例外を処理します。 2. 内部の try-catch ブロックは特定のタイプの例外を処理し、スコープ外の例外が発生した場合、制御は外部例外ハンドラーに渡されます。

画期的な CVM アルゴリズムが 40 年以上の計数の問題を解決します。コンピューター科学者がコインを投げて「ハムレット」を表す固有の単語を割り出す 画期的な CVM アルゴリズムが 40 年以上の計数の問題を解決します。コンピューター科学者がコインを投げて「ハムレット」を表す固有の単語を割り出す Jun 07, 2024 pm 03:44 PM

数を数えるのは簡単そうに思えますが、実際にやってみるととても難しいです。あなたが野生動物の個体数調査を実施するために自然のままの熱帯雨林に運ばれたと想像してください。動物を見かけたら必ず写真を撮りましょう。デジタル カメラでは追跡された動物の総数のみが記録されますが、固有の動物の数に興味がありますが、統計はありません。では、このユニークな動物群にアクセスする最善の方法は何でしょうか?この時点で、今すぐ数え始めて、最後に写真から各新種をリストと比較すると言わなければなりません。ただし、この一般的なカウント方法は、数十億エントリに達する情報量には適さない場合があります。インド統計研究所、UNL、およびシンガポール国立大学のコンピューター科学者は、新しいアルゴリズムである CVM を提案しました。長いリスト内のさまざまな項目の計算を近似できます。

C++ テンプレートの継承を使用するにはどうすればよいですか? C++ テンプレートの継承を使用するにはどうすればよいですか? Jun 06, 2024 am 10:33 AM

C++ テンプレートの継承により、テンプレート派生クラスが基本クラス テンプレートのコードと機能を再利用できるようになり、コア ロジックは同じだが特定の動作が異なるクラスを作成するのに適しています。テンプレート継承の構文は次のとおりです: templateclassDerived:publicBase{}。例: templateclassBase{};templateclassDerived:publicBase{};。実際のケース: 派生クラス Derived を作成し、基本クラス Base のカウント関数を継承し、現在のカウントを出力する printCount メソッドを追加しました。

C文字列におけるcharの役割は何ですか C文字列におけるcharの役割は何ですか Apr 03, 2025 pm 03:15 PM

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Apr 01, 2025 pm 03:06 PM

エラーの原因とソリューションPECLを使用してDocker環境に拡張機能をインストールする場合、Docker環境を使用するときに、いくつかの頭痛に遭遇します...

クロススレッド C++ 例外を処理するにはどうすればよいですか? クロススレッド C++ 例外を処理するにはどうすればよいですか? Jun 06, 2024 am 10:44 AM

マルチスレッド C++ では、例外処理は std::promise および std::future メカニズムを通じて実装されます。promise オブジェクトを使用して、例外をスローするスレッドで例外を記録します。 future オブジェクトを使用して、例外を受信するスレッドで例外を確認します。実際のケースでは、Promise と Future を使用して、さまざまなスレッドで例外をキャッチして処理する方法を示します。

See all articles