目次
動的プログラミングを学ぶにはどうすればよいですか?
動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。
動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!
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];
}
};
最後に次のように書きます。
以上が今回の記事の内容となります、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜