BZOJ 3029 守护者的挑战(DP+概率期望)
打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地。突然,眼前一道亮光闪过。“我,Nizem,是黑魔法圣殿的守卫者。如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包。
擂台赛一共有N项挑战,各项挑战依次进行.第i项挑战有一个属性ai,如果ai>=0,表示这次挑战成功后可以再获得一个容量为ai的包包;如果ai=−1,则表示这次挑战成功后可以得到一个大小为1 的地图残片。地图残片必须装在包包里才能带出擂台,包包没有必要全部装满,但是队员们必须把 获得的所有的地图残片都带走(没有得到的不用考虑,只需要完成所有N项挑战后背包容量足够容纳地图残片即可),才能拼出完整的地图.并且他们至少要挑战成功L次才能离开擂台。
队员们一筹莫展之时,善良的守卫者Nizem帮忙预估出了每项挑战成功的概率,其中第i项挑战成功的概率为pi%。现在,请你帮忙预测一下,队员们能够带上他们获得的地图残片离开擂台的概率。
input
第一行三个整数N,L,K.
第二行N个实数,第i个实数pi表示第i项挑战成功的百分比.
第三行N个整数,第i个整数ai表示第i项挑战的属性值.
output
一个整数,表示所求概率,四舍五入保留6位小数.
0<=N<=200,0<=k<=2000,0<=L<=N
−1<=ai<=1000,0<=pi<=100
设f[i][j][k]表示经过前i项挑战,当前容量为j,有k项挑战获得了胜利的概率.
因为最多只有200场挑战,每次挑战最多得到一个大小为1的地图残片,所以最多消耗200的背包容量,即j的最小值为-200,我们最多也只需要200的背包容量,即j的最大值为200,因为数组对负下标的操作不方便,所以不妨把[−200,200]平移到[0,400]来,相当于把200看作0,j>200表示背包容量有剩余,j<200表示还有碎片装不下.
转移只有两种,即这次挑战成功/失败.
int N,L,K,a[205];
double ans,win[205],lose[205];
double f[205][405][205];
int main(){
N=read();L=read();K=read();
if(K>200)K=200;
//应该不会有人跟我一样,写成if(k>400)k=400吧
//我们只是把[-200,200](看作)移到[0,400]
//k本身的意义不变,背包容量最大为200就足够了
f[1][K+200][0]=1;//初始化
for(int i=1;i<=N;i++){
double ch;cin>>ch;
win[i]=(double)ch/100.0;
lose[i]=(double)1.0-win[i];
}
//把每一次挑战的胜率和败率分别用两个数组存下
for(int i=1;i<=N;i++){
a[i]=read();
}
for(int i=1;i<=N;i++)
for(int j=0;j<=400;j++)
for(int k=0;k<N;k++){
if(f[i][j][k]==0)continue;
f[i+1][j][k]+=f[i][j][k]*lose[i];
//这是第i次(也就是前i+1次)挑战失败的状态转移
if(a[i]>=0){//表示这次胜利且获得背包容量
int cnt=f[i][j][k]*win[i];//偷懒,后面多次用到
if(j+a[i]>400)//超过400移回来
f[i+1][400][k+1]+=cnt;
else f[i+1][j+a[i]][k+1]+=cnt
}
else f[i+1][j-1][k+1]+=cnt;//表示这次胜利且获得碎片
}
N++;
//我们要知道第n次的结果,也就是要知道前n+1次的结果
for(int j=200;j<=400;j++)
for(int k=L;k<N;k++)
ans+=f[N][j][k];
//j在[200,400]范围内才表示背包容量有剩余
//因为要至少取得L次胜利,最多获得 当前的N - 1 次胜利
printf("%.6lf\n",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架