【动态规划】守护者的挑战
【问题描述】
打开了黑魔法师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;
}
【动态规划】守护者的挑战相关推荐
- poj3616 基础的动态规划算法 《挑战程序设计竞赛》
2018-2-5 一开始在考虑这个R要怎么处置,后来突然想到直接把他加到结束时间e后面即可,然后对endtime进行排序,然后找出状态转移方程即可,由于给的数字比较大,我们可以先写成二维的,然后再对二 ...
- [Leetcode][第392题][JAVA][判断子序列][动态规划][双指针]
[问题描述][简单] [解答思路] 1. 双指针 时间复杂度:O(N+M) 空间复杂度:O(1) class Solution {public:bool isSubsequence(string s, ...
- 冲刺大厂每日算法面试题,动态规划21天——第九天
目录标题 导读 21天动态规划入门 面试题 资料领取 导读 肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来.我们先来搞一下让大家最头疼的一类算法题,动态规划我们将进行 ...
- 3月28日服务器维护,3月28日服务器公告:再次出发!
2014年3月26日 再次踏上寻找答案的旅程,小洛克们能找到神秘力量的原因么?一切精彩,尽在洛克王国! 剧情更新 再次出发! 小洛克即将再次踏上寻找答案的旅程,这次他们能够找到神秘力量的来源么! 最新 ...
- 《挑战程序设计竞赛》--初级篇习题POJ部分【动态规划】
关于基本的动态规划和经典的动态规划,在之前已经总结过了,可以温习一下: 传送门 这次是延续上次的<挑战程序设计竞赛>初级篇,总结部分poj上的练习题,主要是DP方面的练习题: 一.基础的动 ...
- poj2385 基础的动态规划算法 挑战程序设计竞赛
2018-2-5 基本的动态规划算法,不知道自己为什么WA,很是绝望,于是只是把代码贴一下? #include<iostream> #include<cstring> usin ...
- 挑战练习题2.3动态规划 poj3046 Ant Counting dp
题目链接: http://poj.org/problem?id=3046 题意: 有T种蚂蚁,共A只.同一个种的蚂蚁长得一样,但是不同种的蚂蚁牙齿颜色不同.任取n只蚂蚁(S<=n<=B), ...
- 挑战练习题2.3动态规划 poj3181 Dollar Dayz 完全背包
题目链接: http://poj.org/problem?id=3181 题意: 农夫约翰有N元钱,市场上有价值1--K的商品无限个,求所有的花钱方案? 题解: http://www.hankcs.c ...
- poj2229 基础的动态规划算法 挑战程序设计竞赛
2018-2-2 首先我们不难看出: 当n为奇数时,dp[n]=dp[n-1],因为它无论如何都会有1在里面. 当n为偶数时,我们通过题意可以看出,它的序列是无序的,换言之,1,1,2和2,1,1是相 ...
最新文章
- 微服务框架-Spring Cloud简介(一)
- 分分钟玩转多进程编程
- Silverlight 全屏模式
- Java NIO 系列教程
- Android短信拦截2019,关于征集2019年度信息科学领域重大项目立项建议的通告
- tomcat https 配置
- 三菱a系列motion软体_合肥三菱FR-A840-07700-2
- ITK:具有写访问权限遍历图像的某个区域
- LeetCode 752. 打开转盘锁(图的BFS最短路径)
- 4个技巧,教你如何用excel绘制出高大上的图表
- 搭建BP神经网络(完整代码快速上手)
- mysql在线修复主从同步
- showModalDialog的用法
- Hadoop安装实验报告
- 武汉理工大学-随机过程-2020年期末复习提纲
- wox wpm 安装 有道插件
- WPS如何给公式加上右边序号
- 我卖掉北京500万的房产,在老家生活的这两年……
- CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scen 论文阅读
- NCN8025 TDA8035 智能卡接口IC读卡器芯片的替代解决方案
热门文章
- 冰雪复古鸿蒙碎片哪里爆,冰雪复古:玩法攻略,如何高爆率搞回收!
- first blogs C语言
- 让我们来做一个属于自己的浏览器主页吧!
- 一个中年大学老师的灵魂年终总结
- 使用redis 报错Address already in use redis无法启动问题 oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
- Ubuntu20.04 引导修复(亲测有效)
- Vue3 Teleport(瞬移)
- JBD Journaling block device
- 转】Fragments (Android官方文档中文版)
- 朴素贝叶斯算法的介绍