自作バグ:メモ再帰で関数と配列の取り違え
EDPCのJ問題,すしのやつ
https://atcoder.jp/contests/dp/tasks/dp_j
```cpp
double f(int s1,int s2,int s3){
if(seen[s1][s2][s3]) return dp[s1][s2][s3];
seen[s1][s2][s3]=true;
double res=1;
if(s1>0) res+=f(s1-1,s2,s3)*s1/n;
if(s2>0) res+=f(s1+1,s2-1,s3)*s2/n;
if(s3>0) res+=f(s1,s2+1,s3-1)*s3/n;
res/=double(s1+s2+s3)/n;
// cout << res << endl;
return dp[s1][s2][s3]=res;
}
```
と書くべきところ,関数ではなく変数を書いていた.orz
```cpp
if(s1>0) res+=dp[s1-1][s2][s3]*s1/n;
```
状態の遷移も忘れた.2枚の皿が減れば,1枚の皿が増えるという当たり前のことが分からず.配列もこのことを考えて切る必要がある.
```cpp
if(s2>0) res+=f(s1,s2-1,s3)*s2/n;
if(s3>0) res+=f(s1,s2,s3-1)*s3/n;
```