質問: 醜い番号は、唯一の素因数がシーケンス1、2、3、4、5、6、8、9、10、12 2、3または5である数であります15、...は最初の11の醜い数字を示しています。慣例により、1が含まれています。醜い番号 - DPアプローチ
数字n
が与えられた場合、タスクはn’th
醜い番号を見つけることです。 (https://www.geeksforgeeks.org/ugly-numbers/)
回答:上記のリンクでの動的プログラミングアプローチ
擬似コード:
1 Declare an array for ugly numbers: ugly[n]
2 Initialize first ugly no: ugly[0] = 1
3 Initialize three array index variables i2, i3, i5 to point to
1st element of the ugly array:
i2 = i3 = i5 =0;
4 Initialize 3 choices for the next ugly no:
next_mulitple_of_2 = ugly[i2]*2;
next_mulitple_of_3 = ugly[i3]*3
next_mulitple_of_5 = ugly[i5]*5;
5 Now go in a loop to fill all ugly numbers till 150:
For (i = 1; i < 150; i++)
{
/* These small steps are not optimized for good
readability. Will optimize them in C program */
next_ugly_no = Min(next_mulitple_of_2,
next_mulitple_of_3,
next_mulitple_of_5);
ugly[i] = next_ugly_no
if (next_ugly_no == next_mulitple_of_2)
{
i2 = i2 + 1;
next_mulitple_of_2 = ugly[i2]*2;
}
if (next_ugly_no == next_mulitple_of_3)
{
i3 = i3 + 1;
next_mulitple_of_3 = ugly[i3]*3;
}
if (next_ugly_no == next_mulitple_of_5)
{
i5 = i5 + 1;
next_mulitple_of_5 = ugly[i5]*5;
}
}/* end of for loop */
6.return next_ugly_no
疑問:
私はDPのアプローチを理解していませんこの場合。
- サブ問題は何ですか?
- この場合の再帰とは何ですか?
- サブ問題はどのように重なっていますか?
なぜ私たちは現在の醜い番号を追跡するのですか?なぜ2,3,5の倍数を通過するのではなく、各点を最小限にとどめてください。
2,3,5と同様です。次に、それぞれの倍数をインクリメントする4,3,5、そして4,6,5 ...キーを押します。
関連質問:nth ugly number(。私は答えてweentが、私は、私が言及した上記の質問で混乱していた)
ここにその記事の質問を投稿する必要があります。そのリンクが死んでしまうと、この全体の質問と答えは誰にとっても役に立たなくなってしまいます。 – Rob
@Robが含まれています、ありがとうございます。答えも含まれています。まだ何か問題がある場合は教えてください。 –