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
なので、動的計画法で解いてます。