paizaの練習問題を解く 階段の上り方 2 Go編
こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 階段の上り方 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]) } これで通りました。 ...