CF498B
私は歌jの確率に耳を傾け前に、動的プログラミングF [i] [j]が二時間を表し、があります。
\(F [I] [J] =のΣf[IK] [J-1] *(1-p_j)^ {K-1} * p_j \)
第二の要件は、私の曲、および第2のホップの曲をホップされていない前に、私は毎秒、I-1までの秒を列挙型k個
この方程式の直接転送の時間複雑です\(O(NT ^ 2)\) 。
最適化するようにしてください。
[I] [J]と[I-1] [j]を式f [i]は[J] Fに[I-1]〜[J] Fから直接転送を考慮すると、実質的に一定であり、fは観察は、見つけることができます。
ダウンタイムの複雑\(O(NT)\) 。
#include <bits/stdc++.h>
using namespace std;
const int N=5005;
int t[N],n,m;
double p[N],f[N][N];
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lf%d",&p[i],&t[i]);
p[i]/=100; //变成概率
}
/*初始化*/
f[0][0]=1;
double sum=0;
/*DP*/
for(int i=1;i<=n;i++){
double ans=0,tp=pow(1-p[i],t[i]);
for(int j=i;j<=m;j++){
ans+=f[i-1][j-1];
if(j-t[i]>=1) ans-=f[i-1][j-t[i]-1]*tp;
f[i][j]=ans*p[i];
if(j-t[i]>=0) f[i][j]+=f[i-1][j-t[i]]*tp;
ans*=1-p[i];
sum+=f[i][j];
}
}
printf("%.9lf",sum);
}