●51NOD 1705 七星剑
题链:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1705
题解:
期望dp,期望的线性性质
(首先对于第k颗星,一定只会用同一种膜法石去炼化它。)
定义f[k]表示炼化成功第k颗星最小的期望花费。
正向枚举k,然后枚举当前用哪个膜法石i去炼化
当然要为两种情况:炼化成功与否
1.成功:期望的花费即为prob[k][i]*c[i]
2.失败:
首先也有一个c[i]的花费(虽然没有成功,但是还是用了这个膜法石),
令j=k-lose[k][i],用拿i膜法石成功炼化第k颗星的期望花费为_f;
然后我们回到之前的某个状态:成功炼化了j-1颗星,
也就是说,我们如果要炼化成功第k颗星,我们还需要重新成功炼化第j~k这些星。
设重新成功炼化那1mol的星,期望需要w的花费,
按照期望的线性性质可以得到:w=f[j]+f[j+1]+......+f[k-1]+_f
若统计前缀和的话,即w=_f+sumf[k-1]-sumf[j-1];
所以可以得到失败时期望花费的转移:
(1-prob[k][i])*(c[i]+_f+sumf[k-1]-sumf[j-1])
所以综上,拿i膜法石成功炼化第k颗星的期望花费为:
_f=prob[k][i]*c[i]+(1-prob[k][i])*(c[i]+_f+sumf[k-1]-sumf[j-1]);
上式通过移项后,可以求出_f的值。
然后对f[k]取min即可:f[k]=min(f[k],_f(每种膜法石都可以得到一个_f))。
dp结束后sumf[7]=f[1]+f[2]+...+f[7]即是答案。
(输出-1的情况直接在读入时特判掉就好)
代码:
#include<bits/stdc++.h>
#define MAXN 105
#define doubleINF 1e37
using namespace std;
const double eps=1e-10;
int c[MAXN],lose[10][MAXN];
double prob[10][MAXN],f[10],sumf[10];
int N;
int main(){
ios::sync_with_stdio(0);
cin>>N;
for(int i=1;i<=N;i++) cin>>c[i];
for(int k=1;k<=7;k++){
bool fg=0;
for(int i=1;i<=N;i++)
cin>>prob[k][i],fg|=(prob[k][i]>eps);
if(!fg) return printf("-1\n"),0;
}
for(int k=1;k<=7;k++)
for(int i=1;i<=N;i++)
cin>>lose[k][i],lose[k][i]=k-lose[k][i];
for(int k=1;k<=7;k++){
f[k]=doubleINF;
for(int i=1;i<=N;i++){
double P=prob[k][i]; int C=c[i],j=lose[k][i];
double _f=P*C+(1-P)*(C+sumf[k-1]-sumf[j-1]);
_f=_f/P;
f[k]=min(f[k],_f);
}
sumf[k]=sumf[k-1]+f[k];
}
cout<<fixed<<setprecision(10)<<sumf[7]<<endl;
return 0;
}
●51NOD 1705 七星剑的更多相关文章
- 51NOD 1705 七星剑 [DP 期望的线性性质]
传送门 题意: 七颗星,第$i$课星用第$j$个宝石有$p[i][j]$的概率成功,失败将为$g[i][j]$颗星: 第$j$个宝石化费$c[j]$ 求最小期望化费 $MD$本来自己思路挺对的看了半天 ...
- 51Nod 1705 七星剑
一道很新颖的概率DP,我看数据范围还以为是有指数级别的复杂度的呢 记得有人说期望要倒着推,但放在这道题上,就咕咕了吧. 我们考虑正着概率DP,设\(fi\)表示将剑升到\(i\)颗星花费的期望,这样我 ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- 51Nod 1278 相离的圆
51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...
- 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...
- 【51Nod 1622】【算法马拉松 19C】集合对
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...
- 【51Nod 1616】【算法马拉松 19B】最小集合
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1616 这道题主要是查询一个数是不是原有集合的一个子集的所有数的gcd. ...
随机推荐
- 北京工业大学耿丹学院2016下C作业学习总结
北京工业大学耿丹学院2016下C的班级地址在https://edu.cnblogs.com/campus/bjgygd/Sixteen-One . 第一次作业:两部分 第一部分:新建博客,书写第一篇随 ...
- Alpha第二天
Alpha第二天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...
- Linux kernel 的 sendfile 是如何提高性能的
Linux kernel 的 sendfile 是如何提高性能的 现在流行的 web 服务器里面都提供 sendfile 选项用来提高服务器性能,那到底 sendfile 是什么,怎么影响性能的呢? ...
- iOS Storyboard unwind segues使用小结
使用storyboard开发的时候,经常会在一个scene上添加一个button,再拖拽这个button到某个想要关联的页面,最后选择push的方式跳转.这样scene_A和scene_B就有了一个& ...
- Windows Server2012 故障转移集群之动态仲裁(Dynamic Quorum)
本篇文章主要介绍Windows2012的故障转移集群一个新功能“动态仲裁”,默认该功能是开启的: 动态仲裁能在当前群集投票出现分歧的情况下取消某些节点的投票权限,比如偶数个节点的群集环境.仲裁见证和动 ...
- Android类加载机制及热修复实现
Android类加载机制 Dalvik虚拟机如同其他Java虚拟机一样,在运行程序时首先需要将对应的类加载到内存中.而在Java标准的虚拟机中,类加载可以从class文件中读取,也可以是其他形式的二进 ...
- nat和napt技术
私网IP地址是指内部网络或主机的IP地址,公网IP地址是指在因特网上全球唯一的IP地址. RFC 1918为私有网络预留出了三个IP地址块,如下: A类:10.0.0.0-10.255.255.255 ...
- confluence搭建详情
Confluence安装&破解&汉化 编辑时间: 2017年7月7日18:01:13 1.介绍 Atlassian Confluence(简称Confluence)是一个专业的wiki ...
- linux centos6.8 下安装mysql 步骤
安装环境:vmware12.centos6.8.centos中配置阿里云数据元 1.下载mysql 运行: sudo yum -y install mysql-server 如果下载失败,可以卸载重新 ...
- 我的jquery validate 笔记
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF- ...