POJ1322Chocolate-- DPはじめに

ここにタイトル

パッケージからチョコレートの各部分を削除し、テーブルの上に置きます。テーブルの上にチョコレートの2つの同一の色がある場合は、両方が失われます。
C色のチョコレートパッケージ(色均一な分布)がある場合、Nは、チョコレートは確率は何であるテーブルの上にMチョコレートを持っていた後にパッケージから除去しますか?
C(C <= 100)、N及びM(N、M <= 1000000):各場合において、3つの非負の整数です。 

要求取らチョコレートN、確率テーブルを残りのMチョコレート件名。それは、我々は、DPの話題を押すことを意味します[i]の[j]はこの意味であります
チョコレートアウト0は、その後、テーブルの上に残っているチョコレートは0確率は何であればまず、境界条件を決定しますか?非常に単純な、DP [0] [0] = 1。
さらに、不正入力C、N、M、0.000の直接出力などの、即ち、確率の決意のために
 
チョコレートは2以上の色数である場合、両方を奪わなければならないため、mは、数未満またはcに等しく、それは、最後の残りのチョコレートのそれぞれがないか、または唯一のものである、です。ほとんどすべての色がテーブルの上にあるので、それがあります
DPの後に[i] [j]は、i番目の元の動作(すなわち、除去チョコレートI)、Jチョコレート発生確率テーブルを示しています。私はjは何が起こるか奇数である+場合だけ、と思いますか?
DP [i] [j]は(そうの場合)0に等しいです。なぜ、それが不可能であるたびにボールがテーブルの上に今意志であり、色のない繰り返しが存在しない場合、繰り返しがある場合は、テーブルの上に+1のボールの数は、2つのボールの繰り返しは、つまり、削除されますので、 iは最初のM、Mに印加される数が同じ瞬間、または-2のいずれかである、奇数表示されません。従ってDP [I] [j]はiが+ Jは、確率0で奇数であります
あなたは手動でチェックをシミュレートすることができます。
 
だから、どのように状態遷移方程式を行うには?よう何色ボールを取得し、テーブル上のボールは繰返さない、即ちDP [I-1] [J -1] *(C-J + 1.0)/ C I-1チョコレートの前面に出て後、J 1チョコレート確率テーブルが残り、確率を繰り返さないチョコレート色のうちのチョコレートでテーブルを乗じ、C-J + 1.0、テーブルを引き、異なる色を表現する色の総数だけでなく、残りのCで割った異なる色は、抽出に対応する異なる色の確率です
いずれかの同じ抽出された色テーブルとボールのボールと奪うように、式があるので:DP [J + 1] *(J + 1.0)/ C [1-I]、+ J. 1 / C、すなわちボールの色とボールのアウトカラーテーブルと同じ
DP [i] [j]は、両方に追加されます
 
大きなnを算出する際にかなりの数が異なることになる後にのみ小数点数mに対応する大小Nの確率は、それが可能であるため、さらに、それは、小さなNとみなすことができますダウンコンバージョン
1 の#include <cstdioを>
 2の#include <iostreamの>
 3の#include <CStringの>
 4  使って 名前空間STDを、
5  の#define MAX 105 
 6  のint main()の
 7  {
 8      INT C = 0、N = 0、M = 0 9      二重 DP [MAX * 10 ] [MAX]。
10      一方(scanf関数(" %のD "、&​​C)!= EOF)
 11      {
 12          であれば(Cの== 0 13         {
 14              ブレーク15          }
 16          のscanf(" %D%dの"、&​​N、&M)。
17          であれば(M> C || M> N ||(M + N)%2 =!0// 特判
18          {
 19              のprintf(" 0.000 \ n " );
20              続け;
21          }
 22          のmemset(DP、0はsizeof (DP))。
23          もし(N> 1000年//大きなn個の変換小さい
24          {
 25              N = 1000年 + N%2 ; // パリティ選択
26である         }
 27          DP [ 0 ] [ 0 ] = 1 ;
 28          INT I = 1 ; I <= N。 ++ I)
 29          {
 30              のためにINT J = 0 ; J <= C; ++ J)
 31である             {
 32                  IF((私はJ + 1)%2!= 0 33であります                 {
 34                      続けます35                  }
 36                  DP [I] [J] DPを= [I - 1 ] [J - 1 ] *(C - J + 1.0)/ C + DP [I - 1 ] [J + 1 ] *(J + 1.0) / C。
37              }
 38          }
 39          のprintf(" %.3lfする\ n " 、DP [n]は[M])。
40      }
 41      リターン 0 42 }

 

 

おすすめ

転載: www.cnblogs.com/ygsworld/p/11329954.html