【動的計画法を学ぶ】N番目のタイボナッチ数(1)

目次

動的プログラミングを学ぶにはどうすればよいですか?

1. トピック分析

2. アルゴリズム原理

1. ステータス表現

2. 状態遷移方程式

3. 初期化

4.注文の実行

5. 戻り値

3. コードの書き方

4. スペースの最適化

最後に書きます


動的プログラミングを学ぶにはどうすればよいですか?

動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。

動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!

1. トピック分析

トピックリンク: 1137. N番目のティボナッチ数 - Leetcode

トピックで指定された条件によると、次のようになります。

Tn+3 = Tn + Tn+1 + Tn + 2、つまり: Tn = Tn - 1 + Tn - 2 + Tn - 3

n 番目のタイボナッチ数は、実際には最初の 3 つの数の合計であることがわかります。 

2. アルゴリズム原理

1. ステータス表現

一般的に言えば、まず dp テーブルとして配列を作成します。

この dp 表に記入すると、答えはこの表の特定の位置にあります。

状態表現の意味とは、テーブル上の値によって表現される意味である。

こうした想像上のことは言うまでもなく、どうやって国家の代表を取得するのでしょうか?

1. トピックの要件に従って

2. 私たちの経験とトピックの要件に基づく

3. 問題を分析する過程で、重複する部分問題が発見される

ただし、このトピックは比較的単純であり、トピックの要件に従って状態表現を直接取得できます。

dp[ i ] は、i 番目のタイボナッチ数を意味します。

2. 状態遷移方程式

状態遷移方程式とは何ですか?

実際には次のとおりです。

dp[ i ] は何かに等しい。

この質問は比較的単純で、状態遷移方程式の式が直接得られます。

したがって、 dp[ i ] は次と等しくなります。

dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] + dp[ i - 3 ] 

3. 初期化

初期化の機能は次のとおりです。

フォームに記入する際は、境界線を越えないよう注意してください。

そして、この質問は私たちにとっても非常に親密なものです。

彼はこう言います: T0 = 0、T1 = 1、T2 = 1、

次に、初期化する必要があるのは、dp[ 0 ] = 0、dp[ 1 ] = 1、dp[ 2 ] = 1、それだけです。 

4.注文の実行

フォームに入力する順序は次のとおりです。現在の状態を入力するとき、必要な状態はすでに計算されています。

 したがって、この質問に記入する順序は左から右になります。

5. 戻り値

実際、戻り値は質問で必要な値を返します。この質問が返すものは次のとおりです: dp[ n ]

3. コードの書き方

まずトピックのインターフェースを見てください。

class Solution {
public:
    int tribonacci(int n) {
        
    }
};

アルゴリズムの原理を学んだ順序でコードを書いてみましょう。

class Solution {
public:
    int tribonacci(int n) {
        // 1. 创建 dp 表
        // 2. 初始化
        // 3. 填表
        // 4. 返回值

        // 处理边界问题
        if(n == 0) return 0;
        if(n == 1 || n == 2) return 1;

        vector<int> dp(n + 1);
        dp[0] = 0, dp[1] = 1, dp[2] = 1; 
        for(int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
        }
        return dp[n];
    }
};

私たちの 4 つのステップに従って、境界問題に対処し、それを解決しました。

4. スペースの最適化

私たちが最初に動的プログラミングを学び始めたとき、最も重要なことは、この問題をどのように解決するかということでした。

最適化する方法を考える代わりに、これについては後で説明しませんが、

ここで、この質問の単純さを利用して、この質問を最適化して、この質問をいじめてみましょう。

一般に、動的プログラミングの空間最適化は、ローリング配列によって最適化されます。

dp テーブルに記入するときは、最初のいくつかの状態のみを使用する必要があり、他の状態が必要なくなったら、

次に、ローリング配列を使用して最適化できます。

class Solution {
public:
    int tribonacci(int n) {
        //空间优化

        // 处理边界问题
        if(n == 0) return 0;
        if(n == 1 || n == 2) return 1;

        int a = 0, b = 1, c = 1, d = 0;
        for(int i = 3; i <= n; i++) {
            d = a + b + c;
            //滚动操作:
            a = b; b = c; c = d;
        }
        return d;
    }
};

 このようにして、スペース消費量は O(N) から O(1) に変化します。

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131513453