動的計画法コンポーネント1:ステータスを決定する
[ステータス]
動的計画法では定海深センに属しています。
一般的に、動的計画法を解くときは、配列fを開く必要があります。配列の各要素f [i]とf [i] [j]はどういう意味ですか、同様です。数学の問題へX、Y、Zは何の略ですか
[状態の判断] 2つの意識が必要です
-最後のステップ-
サブ問題。たとえば
、この質問では:
[キーポイント]
1。前のak-1とk-1が何であるかは気にしませんが、前のコインの組み合わせ
は27-ak2でなければなりません。27-akの数は最小でなければなりません。
だから-------------------->
1.コインの数が最も少ない27-akを綴ります
。2 。元の問題が27と綴られていることは言及する価値があります。3
。元の問題をサブ問題に変換し、スケールが小さくなっています。 :27-ak
4、定義を単純化するために、状態f(X)=少なくともXを作成するために使用されるコインの数を設定します。したがって、元の問題はf(27)を見つけることですが、今度はf( 27-ak)
上記は【状態を決定する部分】です
さて、最後のステップでコインの額面がわかりません。2、5、7のどれですか。
再帰的な解決策は次のとおりです。
class Solution:
'''
面值2 5 7
'''
def pay(self, sum):
res = float('inf')
if sum == 0:
return 0
if sum >= 2:
res = min(res,self.pay(sum-2)+1)
if sum >= 5:
res = min(res,self.pay(sum-5)+1)
if sum >= 7:
res = min(res,self.pay(sum-7)+1)
return res
a = Solution()
print(a.pay(27))
ただし、再帰が繰り返されます。
それを回避するにはどうすればよいですか。
計算結果を保存するには->動的計画法コンポーネント2を参照してください
動的計画法コンポーネント2:伝達方程式
状態方程式f(X)=少なくともXを作成するために使用するコインの数とします。
動的計画法コンポーネント3:初期テスト条件と境界条件
動的計画法コンポーネント4:計算シーケンス
解決:
class Solution:
'''
面值1 2 5 7
'''
def pay(self, sum):
values = [1, 2, 5, 7]
memory = [float('inf')] * (sum+1)
memory[1], memory[2], memory[5], memory[7]= 1, 1, 1, 1
for i in range(3,sum+1):
if i not in values:
memory[i] = min(memory[i], memory[i-1]+1, memory[i-2]+1, memory[i-5]+1, memory[i-7]+1)
return memory[sum]
a = Solution()
print(a.pay(271))
2番目の質問:
解決策は次のとおりです。
class Solution:
def calculate(self,m,n):
map = [[0] * n for i in range(m)]
map[0][0] = 1
'''
目的地是:
map[m-1][n-1]
'''
for i in range(1, n):
map[0][i] = map[0][i-1]
for i in range(1, m):
map[i][0] = map[i-1][0]
for i in range(1,m):
for j in range(1,n):
map[i][j] = map[i-1][j] + map[i][j-1]
return map[i][j]
sol = Solution()
print(sol.calculate(10,10))