こんにちは、ナナオです。

前回に引き続き競プロを実施していきたいと思います。

今回の問題は以下です。

階段の上り方 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])
}

これで通りました。

というか前回のコードの条件式がちょっと変わっただけですね。

ということで今回はこれで👍