守卫者的挑战(据说在bzoj有但我没找到)

 

 

芒果君:一看就是概率dp(可是我不会啊,就算再裸也不会啊)。然后先从最后想,能够满足题意的状态是 挑战次数>=L,获得价值>=0,那一定有f[总挑战数i][挑战成功数j][价值k]。转移很好写,无非两种情况,成功和不成功。不成功,i+1,其他不变,值*(1-p[i]);成功,i+1,j+1,k+w,值是 ∑各种情况*p[i]。题目中有个关键信息是n<=200,也就是说极限情况是200* ±1,我们只需要开200*2的数组,将负数移个位。空间炸了怎么办,滚一滚啊。

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 double ans,p[210],f[2][210][410];
 6 int n,t,m,w;
 7 int main()
 8 {
 9     scanf("%d%d%d",&n,&t,&m);
10     m=min(m,n);
11     for(int i=1;i<=n;++i) scanf("%lf",&p[i]),p[i]/=100.0;
12     f[0][0][n+m]=1;
13     for(int i=1;i<=n;++i){
14         scanf("%d",&w);
15         for(int j=0;j<=n;++j) for(int k=0;k<=(n<<1);++k) f[i&1][j][k]=f[i&1^1][j][k]*(1-p[i]);
16         for(int j=0;j<n;++j) for(int k=1;k<=(n<<1);++k) f[i&1][j+1][min(k+w,n<<1)]+=f[i&1^1][j][k]*p[i]; 
17     }
18     for(int i=t;i<=n;++i) for(int j=n;j<=(n<<1);++j) ans+=f[n&1][i][j];
19     printf("%.6lf\n",ans);
20     return 0;
21 }

 

转载于:https://www.cnblogs.com/12mango/p/7711524.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值