こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
階段の上り方 2 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】
実装
以下のように実装しました。
package main
import "fmt"
func main(){
var n, a, b int
fmt.Scan(&n, &a, &b)
dp := make([]int, n + 1)
dp[0] = 1
dp[a] = 1
dp[b] = 1
for i := 0; i <= n; i++ {
if i > a {
dp[i] += dp[i - a]
}
if i > b {
dp[i] += dp[i - b]
}
}
fmt.Println(dp[n])
}
まず0段の場合は必ず一通り(上らない)となります。
そしてa段目のときとb段目のときにそれぞれ一通りとなるようにします。
これで提出してみましたが、不正解になりました。
考えてみれば、これだとa, b = 2, 4のときにおかしいことになりますね。
また、for文内の条件式がちょっとおかしいかったですね。
ということで修正しました。
package main
import "fmt"
func main(){
var n, a, b int
fmt.Scan(&n, &a, &b)
dp := make([]int, n + 1)
dp[0] = 1
for i := 1; i <= n; i++ {
if i >= a {
dp[i] += dp[i - a]
}
if i >= b {
dp[i] += dp[i - b]
}
}
fmt.Println(dp[n])
}
これで通りました。
というか前回のコードの条件式がちょっと変わっただけですね。
ということで今回はこれで👍