DPダイナミックプログラミング
DP欄
大きな問題を小さな問題に分けるアルゴリズム.
方式は分割征服と同じであるが,分割征服は1回の計算の一部の問題のみを書き,使用しない.ただし、ダイナミックプログラミングでは、計算の一部が保持され、必要に応じて使用され続けます.
従来の方法と比較して,局所問題の繰返しと最適局所構造をもつアルゴリズムを用いて,より少ない時間で解いた.
さぎょうモード
☆大切なのは何を保存するかを決めることです.
ダイナミックプランニングメソッド
1.Bootton-Upモード:繰り返し文の使用
下から上へのアプローチ.
局所的な問題から始め、大きな問題を徐々に解決する方法です.
ex)
整数nが与えられると、nが1、2、3の和で表される方法の数を求めるプログラムが作成される.
仮に4分を1、2、3とする
1+1+1+1
1+1+2
1+2+1
2+1+1
2+2
1+3
3+1
実行できるはずです.全部で7つのケースがあります1であれば、1つのケースがあります.
インスタントラーメン2種
三則四則
ラーメン4個について
5であれば13のケースが発生します.
ここから導出可能
d[n] = d[n-1]+d[n-2]+d[n-3]
このような直観的な小解を求めると,それを利用してより大きな問題を解決することができる.この方法をBottom−up方式と呼ぶ.
ex2)
// 최대 범위 N보다 1 크게 사용.
// memo[0] 초기값 상태 0으로 비워둘것임.
int memo[101];
memo[1] = 1;
memo[2] = 1;
// 메소드로 표현한 피보나치 수열
int fib(int n)
{
for(int i = 3; i <=n; i++){
memo[i] = memo[i-1] + memo[i-2];
}
return memo[n];
}
2.Top-Down方式:再帰関数の使用
これは上から下へ近づく方法です.
大問題から局所問題まで,再帰呼び出しを用いて解く方法である.
例文と「前の問題」、翻訳メモリ
Boottom-upを使用する場合、
d[7]が要求される場合、d[6]d[5]d[4]を知る必要がある
d[6]を得るには、d[5]d[4]d[3]を知る必要があります.
一つ一つ解くとd[5]とd[4]が重なる作業が繰り返され,時間の複雑さの浪費をもたらす.
求めた値を記録し,不要な再帰呼び出しを防止するアノテーション転送操作を行う.
// 최대 범위 N보다 1 크게 사용.
// memo[0] 초기값 상태 0으로 비워둘것임.
int memo[101];
memo[1] = 1;
memo[2] = 1;
// 메소드로 표현한 피보나치 수열
int fib(int n)
{
if (memo[n] != 0)
return memo[n];
memo[n] = fib(n-1) + fib(n-2);
return memo[n];
}
4.動的計画法の運用方法
実際の符号化試験において,DPを用いて問題を解く方法
Top-Down의 경우 재귀 함수
Bottom-Up의 경우 for문
解答を導き出す.階調アルゴリズムvsダイナミックプランニング法
比較した貪欲アルゴリズム(グリッドアルゴリズム)と比較し,その利点を問題に適用すべきである.
動的計画法:すべての方法を逐一研究し、最適解の方法を探し出す.
Reference
この問題について(DPダイナミックプログラミング), 我々は、より多くの情報をここで見つけました https://velog.io/@zioo/DP-동적프로그래밍テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol