競プロ用のメモ

競プロのメモです。競プロで得たc++の知識を書きます。atcoder緑が書いてます。

自作バグ:メモ再帰で関数と配列の取り違え

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;

```