1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Excel で解く AtCoder ABC 129 C

Last updated at Posted at 2020-05-03

はじめに

AtCoder さんの問題をお借りして Excel を使用した解法をご紹介すると共に、Excel が優れた関数型プログラミングツールであることを提示したいと思います。

今回のお題

AtCoder Beginner Contest 129 C - Typical Stairs
Difficulty: 795

下準備

最初にシートを準備し、セルA4=ROW()と入力します。
image.png
Enterを押下すると4が表示されます。
image.png
ROW()は行番号を返すワークシート関数です。
このままでは、0や負の数が使えませんので、オフセットとして=ROW()-4と入力しセルA10までコピーしてください。
image.png
次にセルB5:B101を入力しておきます。
image.png

フィボナッチ数列

*フィボナッチ数列 - wikipedia*と言えば、プログラミングの再帰的処理の例としてよく紹介されます。
まず、フィボナッチ数列の初期値として、セルC4:C51を入力します。
image.png
次にセルC6=C4+C5若しくは=SUM(C4:C5)と入力しセルC7:C10へコピーします。
image.png
これにて、フィボナッチ数列の生成が完了しました。

ABC 129 C 入力例 1

AtCoder Beginner Contest 129 C - Typical Stairs を動的計画法で解きたいと思います。
B列はその段の床の状態を表し、1はその段の床が壊れていないものとし0はその段の床が壊れているものとします。
まず、セルC5=MOD(B5*(C3+C4),1000000007)と修正します。
MOD(数値,除数)は余りを求めるワークシート関数です。
image.png
=IF(B5=1,MOD(C3+C4,1000000007),0)という式でもOKです。
次に、セルC5C6:C10にコピーします。
image.png
最後に、セルB70を入力します。
image.png
これにて、出力例 1 の移動方法の総数: 4を求めることができました。

ABC 129 C 入力例 2

A:C列を 14 行目までコピペし、セルB8:B90を入力します。
image.png
セルC140が解答になります。

ここで仮に高橋君は一歩で 1段か 2段上ることができるの条件を高橋君は一歩で 1段か 2段か 3段上ることができるに変更したとします。
この場合、セルC5の式を=MOD(B5*(C3+C4),1000000007)から=MOD(B5*(C2+C3+C4),1000000007)に修正しコピペすることにより対応可能です。
image.png
一歩で 3段上ることができますので、連続した壊れた床をジャンプしています。

実装例

C++ による実装の例は、editorial や、Ruby による実装の例は、*_こちら_*をご覧ください。

まとめ

  • 再帰や動的計画法は分かりづらい面もありますが、処理自体はシンプルです
  • Excel が優れた関数型プログラミングツールであることを提示しました
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?