もちろんDP確率
私たちは、私はチームは今、この場所jでの行で失われた個人、lyk少女を持って表し確率の大きさdp [i]の[j]を使用します
以下のリストは困難な遷移方程式ではありません。
(明らかに、k番目の位置の前に並んでいるが、爆発を追加するための時間は、確率P4です)
$$ [I] [I] * P2 + P4 $$ F F [i]が[1] = F [i]が[1] *のP1 +
$$ [i] [j]はF [I] [j]を= F [I]、[J-1] [I-1] [J-1] * P3 + P4(j∈[1、K])$$ F *のP2 + F *のP1 +
$$ F [I] [J] = F [I-1] [J-1] * P3(j∈[K + 1、i])とF [I] [J-1] *のP2 + F [I] [J] *のP1 + $$
これは、前後からの再帰的なプロセスですが、非常に耳障りである:[i]の[1]再発の[i]の[i]は$ F $を発生fは、明らかに私たちはものを入れるための方法を見つけます子を排除します
最初の簡略化は、両側で類似アイテムの合併、その結果は、このです。
$$ F [i]が[1] = F [i]は[I] * \ FRAC {P2} {1-P1} + \ FRAC {P4} {1-P1} $$
$$ F [I] [J] = F [I] [J-1] * \ FRAC {P2} {1-P1} + F [I-1] [J-1] * \ FRAC {P3} {1-P1} + \ FRAC {P4} {1-P1}(j∈[1、K])$$
$$ F [I] [J] = F [I] [J-1] * \ FRAC {P2} {1-P1} + F [I -1] [J-1] * \ FRAC {P3} {1-P1}(j∈[K + 1、i])と$$
値は、我々はすべて模索している[I-1]、[]、それは明らかP1、P2、P3、P4、定数として見ることができますfはFを求めてでバックアップする再帰フロントは、[i] [j]は、あるので、知られている、それが一定であります
だから我々は、一定の繰り返しで上に行くことができ、[I] [i]は、未知数と見られている限り、我々は、Fしているとして式にものを置くことができます
おそらくこのような何かを見て:
あなたは、行いたいこと= $ FRAC {P2} {1-P1} $、$ bの= \ FRAC {P3} {1-P1} $、$ C = FRAC \ {P4} {1-P1} $ \
提供$ C_j = F [I-1] [J-1] * C + D $
そこ:[1] $$ F [I] = F [I] [I] * A + C $$
$$ F [I] [2] = F [I]は、[1] * A + C_2 $$
(次いで、F [i]を[1])ように......式②、代入され
最後に、式に一定の最後部ゾルを我々
明らかに得られるF $$ [i]は[I] = A ^ {I} * F [i]は[I] +ゾル$$
その
$$ F [i]は[I] = \ FRAC {ゾル} {1-A ^ I} $$
[] [] $表Fこのすべての$を記入した後この質問はQAQを解決します
しかし、スペースの制約のため、我々は絞り出すしなければならない(値f [i]は[]だけfの[I-1] []関連)[] []最初の次元のF
ここでああ〜コードについて
1 #include<bits/stdc++.h>
2 using namespace std;
3 inline int read(){
4 int ans=0,f=1;char chr=getchar();
5 while(!isdigit(chr)){if(chr=='-')f=-1;chr=getchar();}
6 while(isdigit(chr)) {ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
7 return ans*f;
8 }const int M = 2005;int n,m,k;
9 double f[2][M],p1,p2,p3,p4,a,b,c,v[M],p[M];
10 int main(){
11 while(~scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)){
12 if(fabs(p4)<=1e-5) {puts("0.00000");continue;}//p4为0时显然不可能
13 a=p2/(1-p1),b=p3/(1-p1),c=p4/(1-p1);
14 v[0]=1;for(int i=1;i<=n;i++) v[i]=v[i-1]*a;//预处理a的i次方
15 p[1]=c;f[1][1]=p4/(1-p1-p2);
16 for(int i=2;i<=n;i++){
17 double sol=0;
18 for(int j=2;j<=k;j++) p[j]=f[i-1&1][j-1]*b+c;
19 for(int j=k+1;j<=i;j++) p[j]=f[i-1&1][j-1]*b;//求每一个方程式的常数项
20 for(int j=1;j<=i;j++) sol+=v[i-j]*p[j];//求最后一个式子f[i][i]=......的常数项
21 f[i&1][i]=sol/(1-v[i]);
22 f[i&1][1]=f[i&1][i]*a+c;//回代消元
23 for(int j=2;j<i;j++) f[i&1][j]=f[i&1][j-1]*a+p[j];//回去填表
24 }printf("%.5lf\n",f[n&1][m]);
25 }
26 return 0;
27 }