令 表示前 个歌,已经听了 秒的期望歌数。
有 的转移方程:
观察这个方程,发现对于 和 的形式几乎一样,于是可以通过 转移到 。
复杂度是 。
#include<bits/stdc++.h>
#define now (i&1)
#define nxt (now^1)
#define db double
using namespace std;
const int N=5e3+50;
int n,T,t[N],s[N];
db p[N],f[2][N],ans;
main()
{
cin>>n>>T;
for(int i=1;i<=n;i++)cin>>p[i]>>t[i],p[i]/=100,s[i]=s[i-1]+t[i];
f[0][0]=1;
for(int i=1;i<=n;i++)
{
memset(f[now],0,sizeof f[now]);
db pw=pow(1-p[i],t[i]-1);
for(int j=i;j<=min(T,s[i]);j++)
{
if(j>t[i])
{
f[now][j]=(f[now][j-1]-
f[nxt][j-t[i]-1]*pw*(1-p[i])-
(f[nxt][j-t[i]-1])*pw*p[i])*(1-p[i])+
(f[nxt][j-1])*p[i];
}
else
{
f[now][j]=f[now][j-1]*(1-p[i])+(f[nxt][j-1])*p[i];
}
if(j>=t[i])f[now][j]+=f[nxt][j-t[i]]*pw*(1-p[i]);
ans+=f[now][j];
}
}
cout<<fixed<<setprecision(10)<<ans;
}