JOI 11th('11/'12) - 4 パスタ
解説記事ではないd嘘です。
Nafmoです。Twitterを見ていただいてる方はわかるように、
私は現在、動的計画法を始めとした、競プロっぽい問題が全く解けません。
この問題は動的計画法で えい ってすれば解ける問題なんですが、なんせかけません。
Twitterは流れるし...うーんって考えた結果ここにメモっとこうかなっという発想になりました。
本当に何もわからない()
が、通っちゃいました(追記)
あ、ここで補足なんですが、私がDPといったときは動的計画法を指します。
メモ化再帰で書くDPはメモ化再帰、ループで書くDPはループDPなどと記すことが多いという注意書きをね。
メモ化再帰用関数の名前をDP、メモ用変数をdp...などと書く事が多いです。
問題概要。
- パスタのメニュー、3種類を選びながら食べる
- N日目まで食べたとする。何通り?
- ただし、3日連続同じメニューの場合を除く。
めっちゃ簡単そう。に見えるじゃん?
できません。
私の考察。
- はじめにDP(x,y)=(x日目にyを食べたときの通り数)としました。
- 詰みました。(何もできなかったので)
(eiyaさんが考察ツリーを作って突破していました...) - で、考えを改め引数を増やしました。
- DP(x,y,z)=(x日目にyをとり,x-1日目にzを取ったときの通り数)としてみました。
- dp[x][y][z]=dp[x-1][z][i(1~3)]の和(ただしy==z==iの時を除く)
その日食べれないものを指定していた場合は0を返す
1日目は食べれるものを指定していた場合は1を、それ以外は0を返す - というような感じになるように目指して、実装をはじめました。
書き上げましたが、思っている通りにかけてる気がしないですね...
状況遷移も怪しい動きをしているんですよね...
1通りしかないところ3通りとカウントしてるし
あ、見えたぞ(遅い。)
1日目の処理がおかしい。
あ、通ったwwwwwww
ここの差、0日目を1 2 3選ぶってことをカウントしていた模様。
それをif文で外しました
通っちゃったんだけど?
できました。(落ちねぇ....)