【動的計画法を学ぶ】解読法(4)

目次

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

1. トピック分析

2. アルゴリズム原理

1. ステータス表現

2. 状態遷移方程式

3. 初期化

4.注文の実行

5. 戻り値

3. コードの書き方

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


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

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

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

1. トピック分析

この質問は理解するのが難しくありません。つまり、質問に示されている文字列の番号に従って、

次に、文字にデコードされるケースの数を調べます。次に、先頭にゼロがある数字はデコードできないことに注意してください。 

2. アルゴリズム原理

1. ステータス表現

この質問のステータスは、実際には次のことを示しています。

dp[ i ] 位置は何を表しますか? dp[ i ] 位置は i 番目の位置の復号化方法の総数を表しますか?

2. 状態遷移方程式

状態式の解法は最新のステップに応じて問題を分割し、

それを分析しましょう。 dp[ i ] には 2 つのデコード方法があります。

1. s[ i ] を個別にデコードする 個別にデコードする場合、s[ i ] の値が 1 ~ 9 の場合、単独でデコードできます。

自分自身がデコードしたスキームの数は dp[ i - 1 ] で、s[ i ] の値が 0 の場合、スキームの数は 0 となり、全体のデコードは失敗します。

2. s[ i ] と s[ i - 1 ] は一緒にデコードされます。s[ i - 1 ] * 10 + s[ i ] の値が 10 ~ 26 の場合、デコードできます。

また、デコード番号は dp[ i - 2 ] で、デコードが失敗し、この範囲内にない場合、解の数も 0 になります。

したがって、遷移方程式はおおよそ次のように結論付けることができます。

dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] (上記スキームの数に基づく判定ルール)

3. 初期化

初期化は、フォーム入力時に国境を越えないようにするためのものです。

そして、状態遷移方程式は dp[ i - 1 ] と dp[ i - 2 ] を使用する必要があります。

そこで、 dp[ 0 ] と dp[ 1 ] の位置を初期化します。

dp[ 0 ] 位置、s[ 0 ] のデコードが成功した場合は 1、失敗した場合は 0

dp[ 1 ] の位置、dp[ 1 ] が単独でデコードできる場合は + 1、dp[ 0 ] と一緒にデコードできる場合は + 1、

どちらの場合でも dp[1] をデコードできない場合は 0。(つまり、おそらく 0、1、2)  

4.注文の実行

フォームに記入する順序は依然として左から右です。

5. 戻り値

戻り値は、文字列 dp[ s.size() - 1 ] の最後の位置にある解の数です。

3. コードの書き方

class Solution {
public:
    int numDecodings(string s) {
        // 创建dp表
        int size = s.size();
        vector<int> dp(size);

        // 初始化
        dp[0] = s[0] != '0';
        if(size == 1) return dp[0];

        if(s[0] != '0' && s[1] != '0') dp[1]++;
        int tmp = (s[0] - '0') * 10 + (s[1] - '0');
        if(tmp >= 10 && tmp <= 26) dp[1]++;

        for(int i = 2; i < size; i++) {
            if(s[i] != '0') dp[i] += dp[i - 1]; // 单独解码
            tmp = (s[i - 1] - '0') * 10 + (s[i] - '0');
            if(tmp >= 10 && tmp <= 26) dp[i] += dp[i - 2]; // 和前面联合解码
        }
        return dp[size - 1];
    }
};

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

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

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

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

おすすめ

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