動的なプログラミングアルゴリズムは非常に重要です。
動的プログラミングの基本的な考え方は次のとおりです。意志はいくつかのサブの質問、最初のサブ問題解決、その後、元の問題の解決これらのサブ課題から得られた溶液に問題を解決します。分解による分割統治、フィット感の問題を解決するための動的プログラミングサブ問題は、多くの場合、互いに独立していないとの差です。動的プログラミングサブ問題に問題はなく、副問題は、情報サブ構造の問題のそれぞれ他の、良好な使用を助けるため、独立したが、互いに依存しています。
動的なプログラミング手順は次のとおりです。
1.最適解特性を検索し、前記構造を特徴付けます。
2.最適値は再帰的に定義されました。
ボトムアップ様式3.最適値を計算します。
4.得られた情報、構成の最適値を算出する最適解。
:動的なプログラミングアルゴリズムの有効性は、二つの最も重要な特性に依存する最適な下部のプロパティと重複サブ問題の本質。
ここで行列が絶えず問題を掛け、栗です。
1つの // -動的計画行列乗算問題も 2の#include <入出力ストリーム> 。3の#include <CStringの> 4 。5 使用して 名前空間; STD 6 のint [Pの7 ] = { 30、35、15、5、10、20は、25 }; // 6マトリックス 7。 int型の M [ 6 ] [ 6 ]; // 行列の計算された量を格納する 。8 のint [S 。6 ] [ 6 ]; // ストア分割点マトリックス 9 10 ボイド matrixChain()// 第三ステップ:最適値を算出する(その後、反射コードの前に2つのステップをしない、プロセスが意図されている) 11 // 関数の最適値を算出し、ブレークポイントマトリックスを生成するために、行列がsを返さ 12は 、{ 13は 、INT =長さ6。; 14 のmemset(M、0、はsizeof (M)); 15 のmemset(S、0、はsizeof (S)); 16 のために(INT R&LT = 2 ; R&LT <=長さ; R&LT ++)/ / R&LTは2つだけの行列を開始算出、算出範囲、計算量を表し、順次、6つのターゲットまで三つ、四つを算出 17 // 最小単位から、底部から反射された上方動的プログラミングカウント 18は、 { 。19 用(INT I = 1。 ;私は=長さ、R&LTの+ < 1 ; I ++)// 私は、Jはそれぞれ現在計算された範囲 20は 、{ 21は int型 J =私はR- + 。1 ; 22である = m個のM [I] [J] [ I]は[I] + M [Iは+ 1 ] [J] + P [I] * P [I- 1 ] * P [J]; //は、後者が最適値を必要とするので、実際に存在するので、単に値を見つける 23 S [I] [J] = I; 24 用(INT K = I + 1、K <J、K ++)// 最適化の範囲内の最小値を見つける 25 { 26が INTのTEMP = mの[I] [K] + M [K + 1 ] [J] + P [I- 1 ] * P [K] *P [J]; 27 IF(TEMP < M [I] [J]) 28 { 29 M [I] [J] = TEMP; 30の S [I] [J] = K; 31である } 32 } 33である } 34です } 35 } 36 空隙 TRACEBACK(int型 I、INT J)// ステップ4:最適な構成。S入力マトリックス及び解決所望の範囲、ブラケットの最良の実施形態の出力 37は、[ { 38は、 IF(I == J) 39 { 40 COUT << " M" << " [ " << I << " ] " ; 41 リターン; 42 } 43 COUT << " (" ; 44 トレースバック(I、S [i]は[J]); 45 トレースバック(S [i]は[ J] + 1 、J); 46 COUT << " )" ; 47 } 48 のint main()の 49 { 50 matrixChain(); 51 トレースバック(1、6 )。 52 COUT << M [1 ] [ 6 ] << ENDL。 53 リターン 0 ; 54 }