用語集:
DFS(動的計画):動的計画
DFS(深さ優先探索):深さ優先探索
DPとDFSとの関係
多くの場合、DFSのアイデアや問題解決方法のDPの二種類にある程度まで、これら2つのアルゴリズムは、非常に類似しており、お互いに変換することができます。
DFSは機会のいくつかの特定の用途を除き、もちろん、彼らはしばしばDPを考えると思います。
メインプレDPを使用するという考え、およびDFSは、ステップ探査によってステップゼロから始めると同様です。一般的には、前処理を準備するだけで戦前のように、改善することができます。
基本的なアルゴリズムのDFSとDPは、様々な競技が関与している中で非常に重要であり、習得するようにしてください。
トピック:
トライアングル
説明:
区間の伝送路のどこかの端の上から最大デジタル和を計算するプログラムを書きます。各ステップは、左下または右下のスライダーかもしれません。
入力:
プログラムは標準入力から読み込まれます。三角形の行数:最初の行は、整数Nを含んでいます。以下は、N、三角形のデータ行を記述します。三角形1 <N <= 100の行数すべてデジタル三角形は0と99の間の整数です。
出力:
プログラムは標準出力です。そして、出力最大の整数。
例:
入力:
出力:
DFSのアイデア:
トップダウン、各パスが再び行く必要があります。
最後の層の全ての値を記録し、最後の層を反復することにより算出しました。最後に、最大レベルも望まれています。
特定のコード:
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <functional> 5 using namespace std; 6 7 // the maximum of the triangle ordinal 8 const int max_ordinal = 100; 9 // the depth 10 int num_of_rows; 11 // save data 12 int data[max_ordinal][max_ordinal]; 13 // save the data of the final level 14 vector<int> ans; 15 16 void dfs(int level, int sum, int column) 17 { 18 // avoid multi calculate 19 int current_sum = sum+data[level][column]; 20 // save data which was in final level 21 if(level+1 == num_of_rows) 22 { 23 ans.push_back(current_sum); 24 return; 25 } 26 // binary tree 27 dfs(level+1, current_sum, column); 28 dfs(level+1, current_sum, column+1); 29 } 30 31 int main() 32 { 33 cin >> num_of_rows; 34 for(int i = 0; i < num_of_rows; i++) 35 for(int j = 0; j <= i; j++) 36 scanf("%d", &data[i][j]); 37 38 dfs(0, 0, 0); 39 cout << "output data:" << endl; 40 41 sort(ans.begin(), ans.end(), greater<int>()); 42 for(int i = 0; i < ans.size(); i++) 43 { 44 cout << ans[i] << "\t"; 45 if(!((i+1) % 5)) cout << endl; 46 } 47 cout << endl; 48 49 return 0; 50 }
DP思路:
dfs的思路是从上到下,而dp的思路是:从第二层开始,每下去一次往回看一下并取上一层相邻两个大的那个。
具体代码:
1 #include <iostream> 2 #include <algorithm> 3 #include <functional> 4 using namespace std; 5 6 // same as DFS 7 const int max_ordinal = 100; 8 int num_of_rows; 9 int data[max_ordinal][max_ordinal]; 10 // the array of the dp method 11 int dp[max_ordinal][max_ordinal]; 12 13 int main() 14 { 15 cin >> num_of_rows; 16 for(int i = 0; i < num_of_rows; i++) 17 for(int j = 0; j<= i; j++) 18 scanf("%d", &data[i][j]); 19 20 // dp now 21 dp[0][0] = data[0][0]; 22 for(int i = 1; i < num_of_rows; i++) 23 { 24 for(int j = 0; j <= i; j++) 25 { 26 if(j-1 >= 0) 27 { 28 dp[i][j] = data[i][j] + max(dp[i-1][j], dp[i-1][j-1]); 29 } else { 30 dp[i][j] = data[i][j] + dp[i-1][j]; 31 } 32 } 33 } 34 35 // calling 'sort' method 36 sort(dp[num_of_rows-1], &dp[num_of_rows-1][num_of_rows], greater<int>()); 37 for(int i = 0; i < num_of_rows; i++) 38 cout << dp[num_of_rows-1][i] << " "; 39 cout << endl; 40 cout << "answer is: "; 41 cout << dp[num_of_rows-1][0] << endl; 42 43 return 0; 44 }