codevs 1997 守卫者的挑战
/* 表示很遗憾.. 开始状态想的没错 就是转移的时候出了问题 自己也想到了数组平移 然而没往下写 与正解擦肩而过…. 然后为了好转移写了个4维的 时间不多了没来得及降维 草草的算算空间就交了… 尼玛double忘记*8了 华丽的直接Memory limit exceeded while compiling 我尼玛0分 考试后写了写用原来的状态写了写数组平移然后降维 数据太水就A了 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 210 #define base 200 using namespace std; int n,l,K,p[maxn],c[maxn],sum; double f[2][maxn*10][maxn],ans; int main() { scanf("%d%d%d",&n,&l,&K);sum+=K; for(int i=1;i<=n;i++)scanf("%d",&p[i]); for(int i=1;i<=n;i++) { scanf("%d",&c[i]); if(c[i]!=-1)sum+=c[i]; } f[0][K+base][0]=1; for(int i=1;i<=n;i++) { for(int j=sum+base;j>=0;j--) for(int k=n;k>=0;k--) { if(k>0&&j>=c[i])f[i&1][j][k]+=f[(i-1)&1][j-c[i]][k-1]*(double(p[i])/100.0);//赢了 f[i&1][j][k]+=f[(i-1)&1][j][k]*(double(100-p[i])/100.0);//输了 } for(int j=sum+base;j>=0;j--) for(int k=n;k>=0;k--) f[(i-1)&1][j][k]=0; } for(int i=base;i<=sum+base;i++) for(int j=l;j<=n;j++) ans+=f[n&1][i][j]; printf("%.6f\n",ans); return 0; }