AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC129-C Typical Stairs
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("6 1");
WillReturn.Add("3");
//4
}
else if (InputPattern == "Input2") {
WillReturn.Add("10 2");
WillReturn.Add("4");
WillReturn.Add("5");
//0
}
else if (InputPattern == "Input3") {
WillReturn.Add("100 5");
WillReturn.Add("1");
WillReturn.Add("23");
WillReturn.Add("45");
WillReturn.Add("67");
WillReturn.Add("89");
//608200469
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
const int Hou = 1000000007;
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray();
int N = wkArr[0];
var ASet = new HashSet<int>();
foreach (string EachStr in InputList.Skip(1)) {
ASet.Add(int.Parse(EachStr));
}
//場合の数[現在位置]なDP表
int[] DPArr = new int[N + 1];
DPArr[0] = 1;
int UB = N;
for (int I = 0; I <= UB; I++) {
Action<int> UpdateAct = (pNextDan) =>
{
if (pNextDan <= UB && ASet.Contains(pNextDan) == false) {
DPArr[pNextDan] += DPArr[I];
DPArr[pNextDan] %= Hou;
}
};
UpdateAct(I + 1); // 1段あがる場合
UpdateAct(I + 2); // 2段あがる場合
}
Console.WriteLine(DPArr[UB]);
}
}
解説
動的計画法で解いてます。