【DPメニュー】> 【漸化式】STEP: 1 2項間漸化式 1 (paizaランク C 相当) [難易度: 1390 ±13]
※リンク先へ移動するためには[paiza]へのログインが必要です。
整数 x, d, k が与えられます。
次のように定められた数列の k 項目の値を出力してください。
1 2 |
・ a_1 = x ・ a_n = a_{n-1} + d (n ≧ 2) |
(ヒント)
等差数列の公式を使えばDPを使わずとも答えを求めることができますが、練習だと思ってDPで解いてみましょう。
DPを考える際には、まず漸化式を考えるとよいです。漸化式は、数列の各項をその前の項を用いて記述した式です。問題で与えられている a_n = a_{n-1} + d
という式がこの問題における漸化式となっています。
では、実際にこの問題を解いてみましょう。最終的に求めたいのは a_k です。a_1 ~ a_{k-1} がわかっているとして、a_k がどうなるかを考えてみましょう (a_1 ~ a_{k-1} が、「はじめに」の部分で述べた"部分問題"に相当しています) 。a_{k-1} がわかっているので、a_k = a_{k-1} + d
とすればよいですね。今回は a_1 が x であることがわかっているので、順に a_2, a_3, a_4, ... を計算していけば a_k が求まることがわかるかと思います。
以下の疑似コードを参考にして、あなたの得意な言語で実装してみましょう。
1 2 3 4 5 6 |
a[1] <- x for i = 2 to k a[i] <- a[i-1] + d print a[k] |
入力値(例)
0 7 9
出力値(例)
56
解答例
1 2 3 4 5 6 7 8 9 10 11 |
<?php list($x, $d, $k) = explode(" ", trim(fgets(STDIN))); $a[1] = $x; for ($i = 2; $i <= $k; $i++) { $a[$i] = $a[$i - 1] + $d; } echo $a[$k]; ?> |