AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC375-D ABA
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("ABCACC");
//5
}
else if (InputPattern == "Input2") {
WillReturn.Add("OOOOOOOO");
//56
}
else if (InputPattern == "Input3") {
WillReturn.Add("XYYXYYXYXXX");
//75
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
char[] CharArr = InputList[0].ToCharArray();
int UB = CharArr.GetUpperBound(0);
// 場合の数[文字列]なDP表
var PrevDP = new Dictionary<string, long>();
PrevDP[""] = 1;
long Answer = 0;
foreach (char EachChar in CharArr) {
var CurrDP = new Dictionary<string, long>(PrevDP);
foreach (var EachPair in PrevDP) {
string NewKey = EachPair.Key + EachChar.ToString();
if (NewKey.Length == 2) {
NewKey = EachPair.Key + "A";
}
if (NewKey.Length == 3) {
if (IsKaibun(NewKey)) {
Answer += EachPair.Value;
}
continue;
}
if (CurrDP.ContainsKey(NewKey) == false) {
CurrDP[NewKey] = 0;
}
CurrDP[NewKey] += EachPair.Value;
}
PrevDP = CurrDP;
}
Console.WriteLine(Answer);
}
static bool IsKaibun(string pStr)
{
return pStr[0] == pStr[2];
}
}
解説
場合の数[文字列]でDPしてます。
DPの計算量は、状態数 * 遷移ですが
3文字回文の2文字目を、Aに変換することで状態数を減らし、
TLEを回避してます。