【C#】AtCoder Beginner Contest122 B - ATCoder をC#で解いてみた【AtCoder】

動的計画法にチャレンジ

ようやく動的計画法がボンヤリ分かったり分からなかったりしてきた。
そこで、AtCoderの問題を使って無理矢理試してみようということになった。

f:id:tomdokkk:20201105195347p:plain

サンプルプログラム

        static void Main(string[] args)
        {
            var S = Console.ReadLine();
            List<string> ACGT = new List<string> { "A", "C", "G", "T" };

            bool[] b = new bool[S.Length];
            var ans = 0;

            for (int i = 1; i <= S.Length; i++)
            {
                //退避
                var _b = b;

                foreach (var item in ACGT)
                {
                    if (Convert.ToString(S[i - 1]) == item)
                    {
                        _b[i - 1] = true;
                        b = _b;
                        break;
                    }
                }

                //ACGT以外の文字だったら
                if (_b[i - 1] == false)
                {
                    ans = Math.Max(ans, _b.Count(p => p));
                    b = new bool[S.Length];
                }
            }

            ans = Math.Max(ans, b.Count(p => p));
            Console.WriteLine(ans);


        }

軽く解説

入力した文字の文字数分のbool型配列を作り、初期値は全てfalseとする。
一文字ずつA、C、G、Tが含まれているかを調べ、含まれていたらtrueにする。
含まれていなかったらfalseとし、ansにその時点でのtrueの数を記録する。
bool配列をリセットし、次の文字からまた順番に検査していく。
falseが出てくるたびにansと比べ、最終的に一番大きい数を残し、出力する。

使い方、合ってるかしら('ω')