【问题描述】

打开了黑魔法师Vani 的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi 的
监狱的所在地。突然,眼前一道亮光闪过。“我,Nizem,是黑魔法圣殿的守卫者。如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图„„”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K 的包包。擂台赛一共有N 项挑战,各项挑战依次进行。第i项挑战有一个属性ai ,如果 ai>=0,表示这次挑战成功后可以再获得一个容量为ai的包包;如果ai=-1,则表示这次挑战成功后可以得到一个大小为1 的地图残片。地图残片必须装在包包里才能带出擂台,包包没有必要全部装满,但是队员们必须把获得的所有的地图残片都带走(没有得到的不用考虑,只需要完成所有N 项挑战后背包容量足够容纳地图残片即可),才能拼出完整的地图。并且他们至少要挑战成功L 次才能离开擂台。队员们一筹莫展之时,善良的守卫者Nizem 帮忙预估出了每项挑战成功的概率,其中第i 项挑战成功的概率为pi。现在,请你帮忙预测一下,队员们能够带上他们获得的地图残片离开擂台的概率。

【问题分析】
动态规划求解 考场上首先想到的就是F[i][j][k][l]表示前i个挑战之中获胜j次,当前地图有k个,背包容量为l的概率。但是根据此题数据范围n<=200,会TLE,所以想了一下,可以将k与l压维,新的状态为F[i][j][k]表示前i个挑战之中获胜j次,背包还可以装k个地图的概率,此时-200<=k<=200,所以就巧妙地合并了k l俩维。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=210;
int n,k,l,zero=210; int a[N];
double p[N],ans; double F[2][N][N*2];
int readin()
{int x=0,f=1; char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;
}
int mymax(int a,int b)
{return a>b?a:b;
}
void read()
{int i;n=readin(); l=readin(); k=readin();k=min(k,n);for (i=1;i<=n;i++){p[i]=readin();p[i]/=100.00;}for (i=1;i<=n;i++)a[i]=readin();return;
}
void dp()
{int i,j,x;  int now=1,last=0;F[1][1][mymax(n,zero+k+a[1])]=p[1];F[1][0][k+zero]=1-p[1];for (i=2;i<=n;i++){swap(now,last);memset(F[now],0,sizeof(double)*N*N*2);for (x=zero-n;x<=zero+200;x++)//当j==0时可知之前无胜利 特殊的转移F[now][0][x]+=(1-p[i])*F[last][0][x];for (j=1;j<=n;j++)for (x=zero-n;x<=zero+200;x++){F[now][j][x]+=p[i]*F[last][j-1][x-a[i]];F[now][j][x]+=(1-p[i])*F[last][j][x];}}for (i=zero;i<=zero+200;i++)for (j=l;j<=n;j++)ans+=F[now][j][i];printf("%.6lf\n",ans);return;
}
int main()
{freopen("guard.in","r",stdin);freopen("guard.out","w",stdout);read();dp();return 0;
}

【动态规划】守护者的挑战相关推荐

  1. poj3616 基础的动态规划算法 《挑战程序设计竞赛》

    2018-2-5 一开始在考虑这个R要怎么处置,后来突然想到直接把他加到结束时间e后面即可,然后对endtime进行排序,然后找出状态转移方程即可,由于给的数字比较大,我们可以先写成二维的,然后再对二 ...

  2. [Leetcode][第392题][JAVA][判断子序列][动态规划][双指针]

    [问题描述][简单] [解答思路] 1. 双指针 时间复杂度:O(N+M) 空间复杂度:O(1) class Solution {public:bool isSubsequence(string s, ...

  3. 冲刺大厂每日算法面试题,动态规划21天——第九天

    目录标题 导读 21天动态规划入门 面试题 资料领取 导读 肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来.我们先来搞一下让大家最头疼的一类算法题,动态规划我们将进行 ...

  4. 3月28日服务器维护,3月28日服务器公告:再次出发!

    2014年3月26日 再次踏上寻找答案的旅程,小洛克们能找到神秘力量的原因么?一切精彩,尽在洛克王国! 剧情更新 再次出发! 小洛克即将再次踏上寻找答案的旅程,这次他们能够找到神秘力量的来源么! 最新 ...

  5. 《挑战程序设计竞赛》--初级篇习题POJ部分【动态规划】

    关于基本的动态规划和经典的动态规划,在之前已经总结过了,可以温习一下: 传送门 这次是延续上次的<挑战程序设计竞赛>初级篇,总结部分poj上的练习题,主要是DP方面的练习题: 一.基础的动 ...

  6. poj2385 基础的动态规划算法 挑战程序设计竞赛

    2018-2-5 基本的动态规划算法,不知道自己为什么WA,很是绝望,于是只是把代码贴一下? #include<iostream> #include<cstring> usin ...

  7. 挑战练习题2.3动态规划 poj3046 Ant Counting dp

    题目链接: http://poj.org/problem?id=3046 题意: 有T种蚂蚁,共A只.同一个种的蚂蚁长得一样,但是不同种的蚂蚁牙齿颜色不同.任取n只蚂蚁(S<=n<=B), ...

  8. 挑战练习题2.3动态规划 poj3181 Dollar Dayz 完全背包

    题目链接: http://poj.org/problem?id=3181 题意: 农夫约翰有N元钱,市场上有价值1--K的商品无限个,求所有的花钱方案? 题解: http://www.hankcs.c ...

  9. poj2229 基础的动态规划算法 挑战程序设计竞赛

    2018-2-2 首先我们不难看出: 当n为奇数时,dp[n]=dp[n-1],因为它无论如何都会有1在里面. 当n为偶数时,我们通过题意可以看出,它的序列是无序的,换言之,1,1,2和2,1,1是相 ...

最新文章

  1. 微服务框架-Spring Cloud简介(一)
  2. 分分钟玩转多进程编程
  3. Silverlight 全屏模式
  4. Java NIO 系列教程
  5. Android短信拦截2019,关于征集2019年度信息科学领域重大项目立项建议的通告
  6. tomcat https 配置
  7. 三菱a系列motion软体_合肥三菱FR-A840-07700-2
  8. ITK:具有写访问权限遍历图像的某个区域
  9. LeetCode 752. 打开转盘锁(图的BFS最短路径)
  10. 4个技巧,教你如何用excel绘制出高大上的图表
  11. 搭建BP神经网络(完整代码快速上手)
  12. mysql在线修复主从同步
  13. showModalDialog的用法
  14. Hadoop安装实验报告
  15. 武汉理工大学-随机过程-2020年期末复习提纲
  16. wox wpm 安装 有道插件
  17. WPS如何给公式加上右边序号
  18. 我卖掉北京500万的房产,在老家生活的这两年……
  19. CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scen 论文阅读
  20. NCN8025 TDA8035 智能卡接口IC读卡器芯片的替代解决方案

热门文章

  1. 冰雪复古鸿蒙碎片哪里爆,冰雪复古:玩法攻略,如何高爆率搞回收!
  2. first blogs C语言
  3. 让我们来做一个属于自己的浏览器主页吧!
  4. 一个中年大学老师的灵魂年终总结
  5. 使用redis 报错Address already in use redis无法启动问题 oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  6. Ubuntu20.04 引导修复(亲测有效)
  7. Vue3 Teleport(瞬移)
  8. JBD Journaling block device
  9. 转】Fragments (Android官方文档中文版)
  10. 朴素贝叶斯算法的介绍