AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC189-D Logical Expression
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("2");
WillReturn.Add("AND");
WillReturn.Add("OR");
//5
}
else if (InputPattern == "Input2") {
WillReturn.Add("5");
WillReturn.Add("OR");
WillReturn.Add("OR");
WillReturn.Add("OR");
WillReturn.Add("OR");
WillReturn.Add("OR");
//63
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
// 場合の数[現在値]なDP表
long[] PrevDP = new long[2];
PrevDP[0] = 1;
PrevDP[1] = 1;
foreach (string EachStr in InputList.Skip(1)) {
long[] CurrDP = new long[2];
if (EachStr == "AND") {
CurrDP[0] += PrevDP[0] * 2 + PrevDP[1];
CurrDP[1] += PrevDP[1];
}
else {
CurrDP[0] += PrevDP[0];
CurrDP[1] += PrevDP[0] + PrevDP[1] * 2;
}
PrevDP = CurrDP;
//Console.WriteLine("--------------");
//Console.WriteLine("CurrDP[0]={0}", CurrDP[0]);
//Console.WriteLine("CurrDP[1]={0}", CurrDP[1]);
}
Console.WriteLine(PrevDP[1]);
}
}
解説
X AND Y = 0になる場合の数は、(X=0の場合の数) * 2 + (X=1の場合の数)
X AND Y = 1になる場合の数は、(X=0の場合の数) + (X=1の場合の数) * 2
なので、動的計画法で解いてます。