JUDGEやってみます。Structures」を対象にします。詰まったところや知らなかった関数などをメモします。ALDS1_4_CDNAの塩基配列がぽいぽい渡されたりそれを探したり、という問題。動くものは実装できましたが、TLEで失敗。メモリも使いすぎている。以下の2点を改善したいのですが、Haskellでのうまいやり方がわからないので一旦保留に。find関数の実装を二分探索木に。find関数の結果を随時出力し、メモリ上に保存しないように。searchしてくださいという問題。データ構造として配列を使用するように変更して解決。(他にもIOArrayやら色々あるようですが、今回の用途にはUArrayで問題なし)。walkしましょう、各nodeの番号を指定されたorderで読み上げましょう、という問題。Writerモナドの練習と便利さを感じるのにちょうど良い問題な気がします。postorderの挙動がコードにシンプルに現れているのではないでしょうか。ルートノードを見つける。PreOrderでノード番号を取得する。InOrderでノード番号を取得する。PostOrderでノード番号を取得する。treeALDS1_10_Cいわゆる最長共通部分列(LCS)問題と呼ばれるものです。動的計画法の例として用いられる問題です。Haskellさんで部分問題に分解するのはお手の物なのですが、どうメモ化部分を実装したらいいかがわからず、ひとまずその部分を無視して実装しました。xsこれで正解にはたどり着けますが、パフォーマンスは悪く、submitしても1問目から時間切れになります。いうことで実際のHaskellのLCS実装を調べたところ、Haskellのメモ化パッケージとしてdata-memocombinatorsというのがあるようです。Integralを受け取る1引数関数をメモ化された関数にする。2引数関数をメモ化された関数にする。Memo型のStringは直接は用意されていないのでCharのListとして表現する。M.charこれを使用してLCSを解くと以下の通りです。errorとなります。コード自体も依然パフォーマンス不十分なようでローカルで実行したin4.txtでかなり時間がかかります。ListをArrayにする等できることはまだありますが、最初のものよりは改善されたということでとりあえずはよしとします。