Hatena::Grouptopcoder

cafelier@SRM

cafelier のSRM参加記録です。コンテスト中に考えてたことを執拗に全部書き残すとどうなるだろうかという試み本番中にこういうコードが書きたかったなあ、という後で書いた反省コードを書き残す試み

スパムが来たのでしばらくコメント欄をはてなユーザ限定にしています、すみません、

 | 

2009-03-08

TCO Round1 500

| 11:21 | はてなブックマーク -  TCO Round1 500 - cafelier@SRM

わーいDPだ

class KthProbableElement {
public:
  double probability(int M, int lowerBound, int upperBound, int N, int K) 
  {
    double dp1[101][101]={0}, dp2[101][101], (*P)[101]=dp1, (*Q)[101]=dp2;

    P[0][0] = 1.0;
    for(int i=0; i<M; ++i)
    {
      memset( Q, 0, sizeof(double)*101*101 );
      for(int a=0; a<=i; ++a)
        for(int b=0; a+b<=i; ++b)
        {
          Q[a+1][b] += P[a][b] * (N-lowerBound) / (upperBound-lowerBound+1);
          Q[a][b+1] += P[a][b] * 1 / (upperBound-lowerBound+1);
          Q[a][b]   += P[a][b] * (upperBound-N) / (upperBound-lowerBound+1);
        }
      swap(P, Q);
    }

    double p = 0.0;
    for(int a=0; a<=M; ++a)
      for(int b=0; a+b<=M; ++b)
        if( a<K && K<=a+b )
          p += P[a][b];
    return p;
  }
};

P[a][b] @ i == M個中i個目まで値を選んだとき、N未満の値がa個、Nがb個、(Nより大きいのがi-a-b個)、になっている確率。なんでこれが時間内で書けないかな自分は…

トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/cafelier/20090308
 | 

presented by cafelier/k.inaba under CC0