C++ で最大部分配列とアルゴリズムを使用する方法
C での最大部分配列合計アルゴリズムの使用方法
最大部分配列合計問題は古典的なアルゴリズムの問題であり、指定された整数配列内で連続した部分配列を見つける必要があります。部分配列内のすべての要素の合計が最大になるようにします。この問題は動的計画法という考え方を使うことで解決できます。
シンプルですが非効率な解決策は、網羅的な方法ですべての可能な部分配列を見つけ、それらの合計を計算し、最大の合計を見つけることです。このメソッドの時間計算量は O(n^3) で、配列の長さが長い場合は非常に遅くなります。
より効率的なソリューションは、動的プログラミングの考え方に基づいています。補助配列 dp を定義することで、各要素で終わる部分配列の最大合計を記録できます。 dp[i] は、i 番目の要素で終わる最大の部分配列の合計を表します。 dp[i] については、2 つの状況があります。
- dp[i-1] が 0 より大きい場合、dp[i] = dp[i-1] arr[i];
- dp[i-1] が 0 以下の場合、dp[i] = arr[i]。
配列全体を走査することによって dp 配列の各要素を計算し、同時に最大の部分配列と max_sum、および対応する開始および終了添字 start および end を更新します。より大きな部分配列の合計が見つかった場合は、対応する値を更新します。最後に、サブ配列の最大合計は max_sum で、サブ配列の開始添字は start 、終了添字は end です。
以下は、C 言語で最大部分配列合計アルゴリズムを実装するコード例です:
#include <iostream> #include <vector> using namespace std; vector<int> maxSubarraySum(vector<int>& arr) { int n = arr.size(); int dp[n]; dp[0] = arr[0]; int max_sum = dp[0]; int start = 0, end = 0; for(int i = 1; i < n; i++) { if(dp[i-1] > 0) dp[i] = dp[i-1] + arr[i]; else { dp[i] = arr[i]; start = i; } if(dp[i] > max_sum) { max_sum = dp[i]; end = i; } } vector<int> result; result.push_back(max_sum); result.push_back(start); result.push_back(end); return result; } int main() { vector<int> arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4}; vector<int> result = maxSubarraySum(arr); cout << "最大子数组和:" << result[0] << endl; cout << "子数组的起始下标:" << result[1] << endl; cout << "子数组的终止下标:" << result[2] << endl; return 0; }
上記のコードを実行すると、出力結果は次のようになります:
最大部分配列sum: 6
部分配列の開始添え字: 3
部分配列の終了添え字: 6
上記のコードは、動的計画法の考え方を通じて、O(n) の時間計算量で最大部分配列の合計を解きます。 。 質問。このアルゴリズムは、大規模な配列を扱う場合に非常に効率的です。
以上がC++ で最大部分配列とアルゴリズムを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









C言語データ構造:ツリーとグラフのデータ表現は、ノードからなる階層データ構造です。各ノードには、データ要素と子ノードへのポインターが含まれています。バイナリツリーは特別なタイプの木です。各ノードには、最大2つの子ノードがあります。データは、structreenode {intdata; structreenode*left; structreenode*右;}を表します。操作は、ツリートラバーサルツリー(前向き、順序、および後期)を作成します。検索ツリー挿入ノード削除ノードグラフは、要素が頂点であるデータ構造のコレクションであり、近隣を表す右または未照明のデータを持つエッジを介して接続できます。

この記事では、C標準テンプレートライブラリ(STL)について説明し、そのコアコンポーネント(コンテナ、イテレーター、アルゴリズム、およびファンクター)に焦点を当てています。 これらが一般的なプログラミングを有効にし、コード効率を向上させ、読みやすさを改善する方法を詳述しています。

この記事では、cの効率的なSTLアルゴリズムの使用について詳しく説明しています。 データ構造の選択(ベクトル対リスト)、アルゴリズムの複雑さ分析(STD :: STD :: STD :: PARTIAL_SORTなど)、イテレーターの使用、および並列実行を強調しています。 のような一般的な落とし穴

この記事では、Cでの効果的な例外処理、トライ、キャッチ、スローメカニックをカバーしています。 RAIIなどのベストプラクティス、不必要なキャッチブロックを避け、ログの例外をロギングすることを強調しています。 この記事では、パフォーマンスについても説明しています

記事では、移動セマンティクス、完璧な転送、リソース管理のためのcでのr値参照の効果的な使用について説明し、ベストプラクティスとパフォーマンスの改善を強調しています。(159文字)

ファイルの操作の問題に関する真実:ファイルの開きが失敗しました:不十分な権限、間違ったパス、およびファイルが占有されます。データの書き込みが失敗しました:バッファーがいっぱいで、ファイルは書き込みできず、ディスクスペースが不十分です。その他のFAQ:遅いファイルトラバーサル、誤ったテキストファイルエンコード、およびバイナリファイルの読み取りエラー。

C 20の範囲は、表現力、複合性、効率を伴うデータ操作を強化します。複雑な変換を簡素化し、既存のコードベースに統合して、パフォーマンスと保守性を向上させます。

この記事では、Cでの動的発送、そのパフォーマンスコスト、および最適化戦略について説明します。動的ディスパッチがパフォーマンスに影響を与え、静的ディスパッチと比較するシナリオを強調し、パフォーマンスとパフォーマンスのトレードオフを強調します
