51Nod 1705 七星剑
一道很新颖的概率DP,我看数据范围还以为是有指数级别的复杂度的呢
记得有人说期望要倒着推,但放在这道题上,就咕咕了吧。
我们考虑正着概率DP,设\(fi\)表示将剑升到\(i\)颗星花费的期望,这样我们可以得出转移:
- \(f_i=f_i+f_{i-1}+c_i\) (期望的线性性质,因为无论如何我这\(c_i\)的代价是一定要花的(无论成功与否))
- \(f_i=f_i+(f_i-f_{i-lose_{i,j}-1})\cdot(1-prob_{i,j})\)(表示失败降过星之后在通过各种情况(这个之前已经计算过了)再爬上来)
然后乍一看很成功,但是这个转移有个致命的问题:在转移2中,式子两边同时出现了\(f_i\)
这就是传说中的成环DP了,比较通用的方法是利用图论的哲学操作消去这个情况,但我太弱了所以不会
但在这里有一种说出来吓死你的智障方法——移项
我们连立两个方程,然后将2中的\(f_i\times (1-prob_{i,j})\)移过去即可得到:
\(f_i=\frac{(f_{i-1}+c_j-(1-prob_{i,j})\cdot f_{i-1-lose_{i,j}})}{prob[i][j]}\)
然后就可以直接\(O(7n)\)的DP了,这个复杂度是假的吧
最后注意一下无解的情况要特判
CODE
#include<cstdio>
using namespace std;
typedef double DB;
const int N=105;
const DB EPS=1e-6,INF=1e99;
int c[N],n,lose[10][N];
DB p[10][N],f[10],ans;
bool flag=0;
inline void miner(DB &x,DB y)
{
if (x>y+EPS) x=y;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j; scanf("%d",&n);
for (i=1;i<=n;++i) scanf("%d",&c[i]);
for (i=1;i<=7;++i)
{
for (flag=0,j=1;j<=n;++j)
scanf("%lf",&p[i][j]),flag|=p[i][j]>EPS;
if (!flag) return puts("-1"),0;
}
for (i=1;i<=7;++i)
for (j=1;j<=n;++j)
scanf("%d",&lose[i][j]);
for (i=1,f[1]=INF;i<=7;++i,f[i]=INF)
for (j=1;j<=n;++j)
if (p[i][j]>EPS) miner(f[i],(DB)(f[i-1]+c[j]-(1-p[i][j])*f[i-1-lose[i][j]])/p[i][j]);
printf("%.9lf",f[7]);
return 0;
}
51Nod 1705 七星剑的更多相关文章
- ●51NOD 1705 七星剑
题链: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1705题解: 期望dp,期望的线性性质 (首先对于第k颗星,一定只 ...
- 51NOD 1705 七星剑 [DP 期望的线性性质]
传送门 题意: 七颗星,第$i$课星用第$j$个宝石有$p[i][j]$的概率成功,失败将为$g[i][j]$颗星: 第$j$个宝石化费$c[j]$ 求最小期望化费 $MD$本来自己思路挺对的看了半天 ...
- 【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. ...
随机推荐
- MIPS 安全相关paper阅读笔记
前言 论文来自 https://cyber-itl.org/2018/12/07/a-look-at-home-routers-and-linux-mips.html Linux_MIPS_mis ...
- 浅谈Redis之慢查询日志
首先我们需要知道redis的慢查询日志有什么用?日常在使用redis的时候为什么要用慢查询日志? 第一个问题: 慢查询日志是为了记录执行时间超过给定时长的redis命令请求 第二个问题: 让使用者更好 ...
- 【Python】keras使用LSTM拟合曲线
keras生成的网络结构如下图: 代码如下: from sklearn.preprocessing import MinMaxScaler from keras.models import Seque ...
- dmesg七种用法
dmesg 命令的使用范例 ‘dmesg’命令设备故障的诊断是非常重要的.在‘dmesg’命令的帮助下进行硬件的连接或断开连接操作时,我们可以看到硬件的检测或者断开连接的信息.‘dmesg’命令在多数 ...
- weblogic系列漏洞整理 -- 3. weblogic 后台提权
目录 三. weblogic 后台提权 0. 思路分析 1. 利用过程 2. 提示和技巧 一.weblogic安装 http://www.cnblogs.com/0x4D75/p/8916428.ht ...
- python第三十六天-----类中的特殊成员方法
__doc__ 查看尖的描述信息 __module__表示当前操作的对象所在的模块 __class__表示当前操作的对象所属的类 __init__构造方法 通过类创建对象自动执行 __del__析构方 ...
- Fedora 29 使用 SCL (Software Collections)
在社区中SCL 由Centos 项目进行维护,所以我们使用CentOS 7 SCL源.CentOS SCL中提供了devtoolset-7-gcc-c++,版本正好为 gcc version 7.3. ...
- python装饰器的实现
说起装饰器我们可能已经很熟悉了(不了解的可以查看python基础学习——装饰器),随手就可以写一个简单的装饰器 def decorator(func): def inner(*args, **kwar ...
- Django电商项目---完成购物车页面day4
创建购物车项目App python manage.py startapp df_cart 初始化项目: manas/urls.py manas/settings.py 创建新文件:df_cart/ur ...
- Python读取PE文件(exe/dll)中的时间戳
代码原文地址: https://www.snip2code.com/Snippet/144008/Read-the-PE-Timestamp-from-a-Windows-Exe https://gi ...