トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.44 DPなすごろく
■■■問題■■■
あなたは、Nマスのすごろくをしている。
毎ターン「1」または「2」前に進むことができる。
あなたは最初「0」のマスのスタートにいる。
ちょうどNマスに行く方法は何パターンありますか?
■■■入力■■■
N
すごろくのマス 整数N (2 <= N <= 50) が与えられます。
■■■出力■■■
ちょうどNマスに行く方法のパターン数を求めてください。
答えは 2の32乗 に収まらない時があるので注意です。
C#のソース
using System;
using System.Collections.Generic;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("2");
//2
//2に行く方法は「1・1」と「2」の2パターンです。
}
else if (InputPattern == "Input2") {
WillReturn.Add("3");
//3
//3に行く方法は「1・1・1」と「2・1」と「1・2」の3パターンです。
//「2・1」と「1・2」は区別するのでご注意ください。
}
else if (InputPattern == "Input3") {
WillReturn.Add("5");
//8
//「1・1・1・1・1」
//「2・1・1・1」
//「1・2・1・1」
//「1・1・2・1」
//「1・1・1・2」
//「1・2・2」
//「2・1・2」
//「2・2・1」
//の8通り
}
else if (InputPattern == "Input4") {
WillReturn.Add("50");
//20365011074
//答えは 2の32乗 を超えるのでintでは収まりません。
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int N = int.Parse(InputList[0]);
long[] PatternCntArr = new long[N + 1];
int UB = PatternCntArr.GetUpperBound(0);
PatternCntArr[1] = 1;
PatternCntArr[2] = 2;
for (int I = 3; I <= UB; I++) {
PatternCntArr[I] = PatternCntArr[I - 1] + PatternCntArr[I - 2];
}
Console.WriteLine(PatternCntArr[UB]);
}
}
解説
1マスなら1通り
2マスなら2通り
3マスなら最初に1マス進めば、残り2マスでの場合の数
最初に2マス進めば、残り1マスでの場合の数
4マスなら最初に1マス進めば、残り3マスでの場合の数
最初に2マス進めば、残り2マスでの場合の数
よって、フィボナッチ数列の漸化式となります。