CODEVS 1997 守卫者的挑战(三维dp)

题目很简单,就是一个三维的dp,状态转移方程很好想出来,有一点需要注意这道题目在取的中间过程的时候允许出现背包装不下的情况,只要最后的状态是可以的就行了.注意负数的转移就行了啊.

maxn = 210 MLE, 201就AC了啊。

题目描述 Description

  打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地。突然,眼前一道亮光闪过。“我,Nizem,是黑魔法圣殿的守卫者。如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包。

  擂台赛一共有项挑战,各项挑战依次进行。第项挑战有一个属性ai,如果ai≥0,表示这次挑战成功后可以再获得一个容量为ai的包包;如果ai =
-1,则表示这次挑战成功后可以得到一个大小为 1 的地图残片。地图残片必须装在包包里才能带出擂台,包包没有必要全部装满,但是队员们必须把获得的所有的地图残片都带走(没有得到的不用考虑,只需要完成所有N项挑战后背包容量足够容纳地图残片即可),才能拼出完整的地图。并且他们至少要挑战成功L次才能离开擂台。

  队员们一筹莫展之时,善良的守卫者Nizem帮忙预估出了每项挑战成功的概率,其中第i项挑战成功的概率为pi %。现在,请你帮忙预测一下,队员们能够带上他们获得的地图残片离开擂台的概率。

输入描述 Input Description

  第一行三个整数N,L,K。

  第二行N个实数,第i个实数pi表示第i项挑战成功的百分比。

  第三行N个整数,第i个整数ai表示第i项挑战的属性值。

输出描述 Output Description

  一个整数,表示所求概率,强制四舍五入保留6位小数。

样例输入 Sample Input

【样例输入1】

3 1 0

10 20 30

-1 -1 2

【样例输入2】

5 1 2

36 44 13 83 63

-1 2 -1 2 1

样例输出 Sample Output

【样例输出1】

0.300000

【样例输出2】

0.980387

数据范围及提示 Data Size & Hint

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

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

来源:Nescafe 17

#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-8
#define M 1000100
#define LL long long
//#define LL long long
#define INF 0x3f3f3f
#define PI 3.1415926535898
#define mod 1000000007

const int maxn = 201;

using namespace std;

double dp[maxn][2*maxn][maxn];
struct node
{
    int vi;
    double p;
} f[maxn];

int main()
{
    int n, m, k;
    while(~scanf("%d %d %d",&n, &m, &k))
    {
        double x;
        for(int i = 1; i <= n; i++)
        {
            scanf("%lf",&x);
            x /= 100.0;
            f[i].p = x;
        }
        for(int i = 1; i <= n; i++) scanf("%d",&f[i].vi);
        memset(dp, 0, sizeof(dp));
        dp[0][k+200][0] = 1.0;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= 401; j++)
            {
                for(int p = 0; p <= i-1; p++)
                {
                    dp[i][j][p] += dp[i-1][j][p]*(1.0-f[i].p);
                    int xs = f[i].vi;
                    dp[i][j+xs][p+1] += dp[i-1][j][p]*f[i].p;
                }
            }
        }
        double sum = 0;
        for(int i = 200; i <= 401; i++)
            for(int j = m; j <= n; j++) sum += dp[n][i][j];
        printf("%.6lf\n",sum);
    }
    return 0;
}
时间: 2024-10-25 21:59:09

CODEVS 1997 守卫者的挑战(三维dp)的相关文章

codevs 1997 守卫者的挑战

/* 表示很遗憾.. 开始状态想的没错 就是转移的时候出了问题 自己也想到了数组平移 然而没往下写 与正解擦肩而过…. 然后为了好转移写了个4维的 时间不多了没来得及降维 草草的算算空间就交了… 尼玛double忘记*8了 华丽的直接Memory limit exceeded while compiling 我尼玛0分 考试后写了写用原来的状态写了写数组平移然后降维 数据太水就A了 */ #include<iostream> #include<cstdio> #include<

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

守卫者的挑战 Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者.如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包. 擂台赛一共有N项挑战,各项挑战依次进行.第i

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

题目链接...无 题目: P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过. "我,Nizem,是黑魔法圣殿的守卫者.如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图--"瞬间,队员们被传送到了一个擂台上,最初身边有一 个容量为K的包包. 擂台赛一共有N项挑战,各项挑战依次

1997 守卫者的挑战

题目描述 Description 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者.如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包. 擂台赛一共有项挑战,各项挑战依次进行.第项挑战有一个属性ai,如果ai≥0,表示这次挑战成功后可以再获得一个容量为ai的包包:如果ai = -1,则表示这次挑战成功后可以得到一个

BZOJ 3029 守卫者的挑战 期望DP

题目大意:给定n个事件,第i个事件发生的概率为pi,收益为ai,初始收益为k,求n个事件之后发生的事件数>=l且收益>=0的概率 令f[i][j][k]表示第i个事件进行后已经发生了j个事件且当前受益为k的概率 MB破输入法打两行字错了十多遍 第三维好大- - 不会爆? 实际上第三维大于n就没有意义了 因为收益大于n时一定不会扣到负数 因此将第三维大于n的状态全都存到n上即可 时间复杂度O(n^3) 卡内存差评 #include <cstdio> #include <cstr

守卫者的挑战:三维dp

守卫者的挑战 难度级别: C: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 打开了黑魔法师 Vani 的大门,队员们在迷宫般的路上漫无目的地搜寻着关押 applepi 的监狱的所在地.突然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者.如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为 K 的包包.擂台赛一共有 N 项挑战,各项挑战依次进行.第

[Poetize I]守卫者的挑战

描述 Description 打开了黑魔法师Vani的大门,队员们在迷宫 般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者.如果你能通过我的挑战, 那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包. 擂台赛一共有N项挑战,各项挑战依 次进行.第i项挑战有一个属性ai,如果ai>=0,表示这次挑战成功后可以再获得一个容量为ai的包包:如果ai=-1,则表示这次挑战成功后可 以得

TYVJ-P1864 守卫者的挑战 题解

P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者.如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包. 擂台赛一共有N项挑战,各项挑战依次进行.第i项挑战有一个属性ai,如果ai

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

[TYVJ1864][Poetize I]守卫者的挑战 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过."我,Nizem,是黑魔法圣殿的守卫者.如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图--"瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包. 擂台赛一共有N项挑战,各项挑战依次进行.第i项挑战有一个属性ai,如果ai>=0,表示这次挑战成功后可以再获得一个容量为ai的包包:如