BZOJ2435 守卫者的挑战 - 期望dp
2017-08-02 20:42
253 查看
传送门
题解:
考虑dp。dp[i][j][k]表示当前第i场,已经赢了j场,背包容量为k(可能为负)的概率。
转移显然。可以用n+1表示背包容量无穷大(因为显然碎片最多n个,容量太大就变成无穷大了)。
代码:
#include<iostream>
//BZOJ 3029
#include<cstdio>
#include<cstring>
#define MAXN 210
using namespace std;
double dp[2][MAXN][MAXN<<1|1],p[MAXN];
int cnt=0,a[MAXN];
inline int upd(int x) { return x+cnt; }
int main()
{
int n,k,s;scanf("%d%d%d",&n,&s,&k);
for(int i=1;i<=n;i++)
{
int x;scanf("%d",&x);
p[i]=x/100.0;
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
if(a[i]==-1) cnt++;
dp[0][0][upd(min(cnt+1,k))]=1.00;
int pre=0,now=1;
for(int i=0;i<n;i++,swap(now,pre))
{
for(int j=0;j<=i+1;j++)
for(int rc=-cnt;rc<=cnt+1;rc++)
dp[now][j][upd(rc)]=0.0;
for(int j=0;j<=i;j++)
4000
for(int rc=-cnt;rc<=cnt+1;rc++)
{
int r=upd(rc);
dp[now][j][r]+=(1-p[i+1])*dp[pre][j][r];
if(a[i+1]==-1)
{
if(r) dp[now][j+1][r-1]+=p[i+1]*dp[pre][j][r];
}
else dp[now][j+1][min(upd(cnt+1),r+a[i+1])]+=p[i+1]*dp[pre][j][r];
}
}
double ans=0.0;swap(now,pre);
for(int i=s;i<=n;i++)
for(int j=0;j<=cnt+1;j++)
ans+=dp[now][i][upd(j)];
printf("%.6lf\n",ans);return 0;
}
题解:
考虑dp。dp[i][j][k]表示当前第i场,已经赢了j场,背包容量为k(可能为负)的概率。
转移显然。可以用n+1表示背包容量无穷大(因为显然碎片最多n个,容量太大就变成无穷大了)。
代码:
#include<iostream>
//BZOJ 3029
#include<cstdio>
#include<cstring>
#define MAXN 210
using namespace std;
double dp[2][MAXN][MAXN<<1|1],p[MAXN];
int cnt=0,a[MAXN];
inline int upd(int x) { return x+cnt; }
int main()
{
int n,k,s;scanf("%d%d%d",&n,&s,&k);
for(int i=1;i<=n;i++)
{
int x;scanf("%d",&x);
p[i]=x/100.0;
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
if(a[i]==-1) cnt++;
dp[0][0][upd(min(cnt+1,k))]=1.00;
int pre=0,now=1;
for(int i=0;i<n;i++,swap(now,pre))
{
for(int j=0;j<=i+1;j++)
for(int rc=-cnt;rc<=cnt+1;rc++)
dp[now][j][upd(rc)]=0.0;
for(int j=0;j<=i;j++)
4000
for(int rc=-cnt;rc<=cnt+1;rc++)
{
int r=upd(rc);
dp[now][j][r]+=(1-p[i+1])*dp[pre][j][r];
if(a[i+1]==-1)
{
if(r) dp[now][j+1][r-1]+=p[i+1]*dp[pre][j][r];
}
else dp[now][j+1][min(upd(cnt+1),r+a[i+1])]+=p[i+1]*dp[pre][j][r];
}
}
double ans=0.0;swap(now,pre);
for(int i=s;i<=n;i++)
for(int j=0;j<=cnt+1;j++)
ans+=dp[now][i][upd(j)];
printf("%.6lf\n",ans);return 0;
}
相关文章推荐
- 【BZOJ3029】守卫者的挑战 [期望DP]
- BZOJ 3029 守卫者的挑战 期望DP
- [BZOJ 3029]守卫者的挑战:期望DP
- bzoj[3029]守卫者的挑战(期望概率dp)
- bzoj3029 守卫者的挑战(概率dp)
- bzoj 3029: 守卫者的挑战 概率dp
- 【bzoj3029】守卫者的挑战 概率dp
- bzoj3029 守卫者的挑战(概率dp)
- bzoj 3029: 守卫者的挑战【概率dp】
- 【BZOJ3925】地震后的幻想乡(期望概率DP,状压DP)
- BZOJ 4832 [Lydsy2017年4月月赛]抵制克苏恩 期望dp
- [bzoj2435][Noi2011]道路修建(树上dp)
- bzoj 1076: [SCOI2008]奖励关 (期望dp)
- 【bzoj1419】Red is good 期望dp
- tyvj P1864 [Poetize I]守卫者的挑战(DP+概率)
- 【BZOJ1419】Red is good(期望DP)
- BZOJ4872 [六省联考2017]分手是祝愿 【期望dp】
- bzoj 3036: 绿豆蛙的归宿 (拓扑序+概率期望DP)
- bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)
- BZOJ - 4318: OSU! (期望DP&Attention)