[python]動的計画法に関する注意事項[1] 4つのステップ

動的計画法コンポーネント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))

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Sgmple/article/details/113096850