题面

Description

打开了黑魔法师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 位小数。

Sample Input

3 1 0
10 20 30
-1 -1 2

Sample Output

0.300000

HINT

若第三项挑战成功,如果前两场中某场胜利,队员们就有空间来容纳得到的地图残片,如果挑战失败,根本就没有获得地图残片,不用考虑是否能装下;若第三项挑战失败,如果前两场有胜利,没有包来装地图残片,如果前两场都失败,不满足至少挑战成功次()的要求。因此所求概率就是第三场挑战获胜的概率。

对于 100% 的数据,保证0<=K<=2000,0<=N<=200,-1<=ai<=1000,0<=L<=N,0<=pi<=100。

题解

DP傻题.

\(f[i][j][k]\)表示第\(i\)个完成挑战后, 总共成功\(j\)个挑战, 背包剩余容量为\(k\)的概率.

我们发现\(k\)可能小于\(0\), 因此要把\(k\)整体挪一下位.

#include <cstdio>
#include <cstring>
#include <algorithm> const int N = 200;
int main()
{
#ifndef ONLINE_JUDGE
freopen("BZOJ3029.in", "r", stdin);
#endif int n, m, c;
scanf("%d%d%d", &n, &m, &c);
static double pr[N + 1];
for(int i = 1; i <= n; ++ i)
scanf("%lf", pr + i);
for(int i = 1; i <= n; ++ i)
pr[i] /= 100;
static int a[N + 1];
for(int i = 1; i <= n; ++ i)
scanf("%d", a + i);
static double f[N + 1][N + 1][N << 1 | 1];
memset(f, 0, sizeof(f));
f[0][0][N + std::min(c, n)] = 1;
for(int i = 0; i < n; ++ i)
for(int j = 0; j <= i; ++ j)
for(int k = N - n; k <= N + n; ++ k)
f[i + 1][j + 1][std::min(n + N, k + a[i + 1])] += f[i][j][k] * pr[i + 1],
f[i + 1][j][k] += f[i][j][k] * (1 - pr[i + 1]);
double ans = 0;
for(int i = m; i <= n; ++ i)
for(int j = N; j <= N + n; ++ j)
ans += f[n][i][j];
printf("%lf", ans);
}

当然还有另一个编辑版的题解

#include <cstdio>
#include <cstring>
#include <algorithm> const int N = 200;
int main()
{
#ifndef ONLINE_JUDGE
freopen("BZOJ3029.in", "r", stdin);
#endif int n, m, c; scanf("%d%d%d", &n, &m, &c); static double pr[N + 1];
for(int i = 1; i <= n; ++ i) scanf("%lf", pr + i); for(int i = 1;
i <= n; ++ i) pr[i] /= 100; static int a[N + 1]; for(int i =
1; i <= n; ++ i) scanf("%d", a + i); static double f[N + 1][N +
1][N << 1 | 1]; memset(f, 0, sizeof(f)); f[0][0][N + std::min(c, n)] =
1; for(int i = 0; i < n; ++ i) for(int j = 0; j <= i; ++ j)
for(int k = N - n; k <= N + n; ++ k) f[i +
1][j + 1][std::min(n + N, k + a[i + 1])] += f[i][j][k] * pr[i + 1],
f[i + 1][j][k] += f[i][j][k] * (1 - pr[i + 1]); double ans = 0;
for(int i = m; i <= n; ++ i) for(int j = N; j <= N + n; ++ j)
ans += f[n][i][j]; printf("%lf", ans); }

BZOJ 3029 守卫者的挑战的更多相关文章

  1. bzoj 3029 守卫者的挑战 —— 概率DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3029 设 f[i][j][k] 表示第 i 次挑战,已经成功 j 次,剩余容量为 k 的概率 ...

  2. bzoj 3029 守卫者的挑战——概率期望dp+状态数思考

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3029 先随便写了个dfs,记录“前 i 次.成功 j 次.容量-残片=k”的概率.因为是否可 ...

  3. bzoj 3029: 守卫者的挑战【概率dp】

    以后写dp还是向后转移吧--写的把前面加起来的版本怎么也调不过去 首先注意,因为地图碎片只占1体积,所以>n,<-n的体积是没用的,所以就可以把体积降到n级别,然后用这场胜负像后转移即可, ...

  4. 【TYVJ1864】[Poetize I]守卫者的挑战 概率与期望

    [TYVJ1864][Poetize I]守卫者的挑战 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过."我 ...

  5. TYVJ1864 守卫者的挑战

    P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...

  6. tyvj P1864 [Poetize I]守卫者的挑战(DP+概率)

    P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...

  7. TYVJ.1864.[Poetize I]守卫者的挑战(概率DP)

    题目链接...无 题目: P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们 ...

  8. TYVJ-P1864 守卫者的挑战 题解

    P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...

  9. 【BZOJ3029】守卫者的挑战 [期望DP]

    守卫者的挑战 Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 打开了黑魔法师Vani的大门,队 ...

随机推荐

  1. mysql进阶三四五六

    排序查询 一.语法 select 查询表 from 表 where 筛选条件 order by 排序列表[asc / desc] 特点: 1.asc:升序 desc:降序 2.排序列表之中支持单字段, ...

  2. mysql基础查询

    #进阶1:基础查询/*语法:select:查询列表 from 表名; 类似于:System.out.println(打印的东西); 特点:1.查询列表可以是:表中的字段.常量值.表达式.函数2.查询的 ...

  3. easyui 判断密码是否输入一致

    1.首先要扩展validatebox,添加验证两次密码功能 $.extend($.fn.validatebox.defaults.rules, { eqPassword:{ validator:fun ...

  4. 设计模式之第5章-解释器模式(Java实现)

    设计模式之第5章-解释器模式(Java实现) “开个商店好麻烦,做个收单的系统,发现类的方法好多.”“真是的,不就是简单的四则运算,这都不会!”你说你会啊.来来来,你把以下的方法用代码写出来: a+b ...

  5. 【Palindrome Number】cpp

    题目: Determine whether an integer is a palindrome. Do this without extra space. click to show spoiler ...

  6. MFC DLL 可以封装MFC的窗体 供别的MFC程序使用

    MFC DLL  可以封装MFC的窗体 供别的MFC程序使用 在庞大程序分工里面 非常可取. 可以细分每个窗体就是单独的 模块. [后续不断完善]

  7. 虚拟机VMware安Mac OS时没有Apple mac选项

    相信大家很多人在虚拟机安装mac os时候发现在选择客户机操作系统时候,没有Apple mac os选项,这样就会导致无法进行下一步,下面我来给大家详细介绍怎么添加这一项. 1.首先安装unlocke ...

  8. POJ 3255:Roadblocks(次短路)

    题目大意:求无向图的次短路. 分析: 在起点终点各求一次最短路,枚举边,通过该边的最短路为其权值加上到起点和终点最短路之和,找到最短但又比最短路长的路径. 代码: program block; typ ...

  9. POJ 3254:Corn Fields(状态压缩DP)

    题目大意:一个矩形的草地,分为多个格子,有的格子可以有奶牛(标为1),有的格子不可以放置奶牛(标为0),计算摆放奶牛的方案数. 分析: f[i,j]表示第i行状态为j的方案总数. 状态转移方程f[i, ...

  10. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...