文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

AtCoder Grand Contest 031 感想

AtCoder Grand Contest 031 に参加しました。


2時間、一生懸命考えましたが解法のカの字も浮かびませんでした。したがって提出していません。


A - Colorful Subsequence

atcoder.jp
文字の出現回数+1 をかけ合わせるだけでいいみたいです。


仮に、a=1, b=1, c=1 としてみます。このとき、それぞれを取るか取らないかという考え方をして、答えは 2*2*2 で 8......ですが一つも取らないということはできないので 8-1=7通りとなります。


a=1, b=1, c=3 のとき。a,b については同様。c は、1番目を取るか、2番目を取るか、3番目を取るか、取らないかの 4 種類。したがって、2*2*4-1 で15通りとなります。

敗因

組み合わせ = 2^N だと思い込んでいた。先ほどの例だと、a=1, b=1, c=1 のときの求め方は 2^1 * 2^1 * 2^1 だと勝手に思い込んでいたということです。なぜかはわかりませんが僕の頭の中はこうなっていました。


そのため、2^3 とか、2^3 - (2^(k-1) - 1) とかわけのわからない数式を量産して混乱していました。よって、数学の「組み合わせ問題」に慣れていなかったせいである、と結論することができるでしょう。数学を勉強しましょうね。

解法の発想へ至る思考手順

・BIT全探索で組み合わせを列挙できるか?
 →できない。アルファベットは全26文字なので、n=10程度が限度。
再帰関数かDPとかそういう感じか?
 →200点問題だから出ない
 →もっとシンプルな解法。少なくとも O(N) かあるいは O(26)
・しゃくとり法か?
 →だから200点問題では出ないって言ったでしょ
 →それにしゃくとり法でやったらとんでもなく複雑になる
・文字の個数が入った長さ26の配列を線形探索して答えを出せないか?
 →順に掛け算するのではダメ
 →あれっ、個数+1 をかけていったものが答えになっていやしないか?(発想の跳躍)(出力から帰納
 →AC