動的計画法の本質

     当初の公開:

 

     最初に問題を見てみましょう:

     a、b、c、nはすべて正の整数、非負の整数x、y、zはax + by + cz = nを満たし、min {x + y + z}を見つけます。

     直感的なアルゴリズムは次のとおりです。x、y、zを列挙した後、min {x + y + z}を見つけます。ただし、これは最良のアルゴリズムではありません。この記事を読んだ後、動的計画法を使用してこの問題を解決できます。

     

      動的計画法を紹介する前に、まずT社の筆記試験の質問を見てみましょう。

     順列と組み合わせを研究した人は、直接それを行うことができるはずです:C(12,5)-C(6,3)* C(6,2)

     結果は次のとおりです:492

 

     順列と組み合わせを忘れてしまった友達もいるので、どうすればいいですか?あなたはそれを機械的に行うことを検討することができます。以下に示すように、法則を見つけましょう。

      ポイントXからポイントYまでのメソッドの数がf(X、Y)であるとすると、次のようになります。

      f(M、B)= 1

      f(N、B)= 1

      f(E、B)= f(M、B)= 1

      f(C、B)= f(M、B)+ f(N、B)= 2

      f(D、B)= f(E、B)+ f(C、B)= 3

      

     点Bを(0,0)の原点として、a [i] [j]を点(i、j)から点Bに移動する方法の数としてとると、漸化式を簡単に取得できます。

     a [i] [j] = a [i] [j-1] + a [i-1] [j]

     その中で、iとjはどちらも0より大きい。iまたはjが0であるという境界条件は、一目でわかる。また、Pは図の特別な点であることに注意してください。筆記試験場では、上記の漸化式を使ってこの質問をすると、せいぜい3分しかかかりません。

 

     問題の規模が大きくなると、再帰式で計算するのは非常に面倒ですが、コンピューターの場合は、これらの定期的な計算に最適です。次に、コンピューターに次の計算をさせます。

package main

import "fmt"

func main() {
   a := [6][8]int {}; 
   for j := 1; j < 8; j++ {
       a[0][j] = 1   // first row
   }

   for i := 1; i < 6; i++{
       a[i][0] = 1   // first column
   }

   // B point  a[0][0] = 0
   for i := 1; i < 6; i++ {
       for j := 1; j < 8; j++ {
           a[i][j] = a[i-1][j] + a[i][j-1]
           if i == 2 && j == 4 {
               a[i][j] = 0  // P point
           }
       }
   }

   fmt.Println(a[6-1][8-1]) // A point
}

      結果は次のとおりです:492

 

     これまでのところ、動的計画法(動的計画法)を感じていませんが、動的計画法とは何ですか?動的計画法は、最適な意思決定プロセスを解決するプロセスであり、経済、軍事、自動化などの分野で広く使用されています。動的計画法の本質は再帰ですが、一部の動的計画問題では、再帰が明確ではなく、再帰関係を構築するのに多大な労力を要します。

 

    最後に、記事の冒頭にある質問を見てみましょう。動的計画法の再帰式は次のとおりです。f(n)= min {f(na)+ 1、f(nb)+ 1、f(nc)+ 1}、ここで、f(n)はnのスケールでmin {x + y + z}です。さらに、境界条件に注意を払う必要があります。

     ダイナミックプランニングは、面接の必見のコンテンツです。求職者にとっては、よりダイナミックなプランニング思考を訓練し、自分の気持ちを見つける必要があります。動的計画法の内容については、まず話しましょう。

おすすめ

転載: blog.csdn.net/stpeace/article/details/108700774