点此看题面

大致题意: 你要把一把剑从0星升至7星,有n颗宝石供你选择,第i颗宝石的价值是c[i],用第i颗宝石将剑从k-1星升至k星的成功率是prob[k][i],而失败后会掉lose[k][i],要你求出将剑升至7星的期望花费。

题解

看到这题,自然而然地就会想到用动态规划来做,而转移方程其实也很好推:

f[i]=min(f[i],f[i-1]+c[j]+(1-prob[i][j])*(f[i]-f[i-1-lose[i][j]));

其中f[i]表示将剑升至i星的期望花费

就这么简单?

\(But\ wait\ a\ minute...\)

在转移方程中左边和右边同时出现了\(f[i]\)!

这就是传说中的成环\(DP\)

那么成环\(DP\)该怎么做呢?

其实在这道题目中有一个很简单的方法:移项。没错,就是我们初一上学期就接触过的移项。

通过移项,原转移方程就变成了

f[i]=min(f[i],(f[i-1]+c[j]-(1-prob[i][j])*f[i-1-lose[i][j]])/prob[i][j]);

这样不就直接水过了吗!(顺便吐槽一下\(N≤100\)这样的数据范围真是太水了)

代码

#include<bits/stdc++.h>
#define LL long long
#define min(x,y) ((x)<(y)?(x):(y))
#define N 100
using namespace std;
int n,c[N+5],lose[10][N+5];
double prob[10][N+5],f[10];
int read()
{
int x=0,f=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') f=-1,ch=getchar();
while(ch>='0'&&ch<='9') (x*=10)+=ch-'0',ch=getchar();
return x*f;
}
int main(register int i,register int j,bool flag,bool ff)
{
for(n=read(),i=1;i<=n;c[i++]=read());
for(i=1,ff=true;i<=7;(flag?0:ff=false),++i)
for(j=1,flag=false;j<=n;scanf("%lf",&prob[i][j]),flag|=prob[i][j++]>0.0);
if(!ff) return puts("-1"),0;//判断是否存在不可能的情况
for(i=1;i<=7;++i)
for(j=1;j<=n;lose[i][j++]=read());
for(i=1;i<=7;++i)//DP过程,理解了再打真的很简单
for(f[i]=1e18,j=1;j<=n;++j)
f[i]=min(f[i],(f[i-1]+c[j]-(1-prob[i][j])*f[i-1-lose[i][j]])/prob[i][j]);
return printf("%.8lf",f[7]),0;
}

【51nod1705】七星剑(成环DP)的更多相关文章

  1. 51Nod 1705 七星剑

    一道很新颖的概率DP,我看数据范围还以为是有指数级别的复杂度的呢 记得有人说期望要倒着推,但放在这道题上,就咕咕了吧. 我们考虑正着概率DP,设\(fi\)表示将剑升到\(i\)颗星花费的期望,这样我 ...

  2. bzoj1023

    研究了一下仙人掌首先,仙人掌虽然不是树,但却有很强的树的既视感如果把每个环都看做一个点,那么他就是一棵树当然这不能直接缩环,因为环和环可以有一个交点如果是树,求直径都会做,令f[i]表示i到子树的最长 ...

  3. Luogu P3953 逛公园(最短路+记忆化搜索)

    P3953 逛公园 题面 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园的入口,\(N\) 号点是公 ...

  4. 51NOD 1705 七星剑 [DP 期望的线性性质]

    传送门 题意: 七颗星,第$i$课星用第$j$个宝石有$p[i][j]$的概率成功,失败将为$g[i][j]$颗星: 第$j$个宝石化费$c[j]$ 求最小期望化费 $MD$本来自己思路挺对的看了半天 ...

  5. 成环的概率dp(初级) zoj 3329

    原题地址:https://vjudge.net/problem/ZOJ-3329 题目大意: 有三个骰子,分别有k1,k2,k3个面,初始分数是0.第i骰子上的分数从1道ki.当掷三个骰子的点数分别为 ...

  6. zoj3329--One Person Game(概率dp第六弹:形成环的dp,带入系数,高斯消元)

    One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very ...

  7. HDU 4652 Dice:期望dp(成环)【错位相减】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4652 题意: 给你一个有m个面的骰子. 两种询问: (1)"0 m n": “最后 ...

  8. ZOJ 3329 One Person Game:期望dp【关于一个点成环——分离系数】

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 题意: 给你面数分别为k1,k2,k3的三个骰子. 给定a ...

  9. ZOJ Problem Set - 3329(概率DP)

    One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very ...

随机推荐

  1. windows severs 2008r2 180天激活

    无需破解:Windows Server 2008 R2 至少免费使用 900天 1.首先安装后,有一个180天的试用期. 2.在180天试用期即将结束时,使用下面的评估序列号激活Svr 2008 R2 ...

  2. Mysql-5.7.14使用常见问题汇总

    常见问题汇总: 一. 当我们用navicate premiun 连接远程数据库时,若出现如下问题:

  3. 开源库SRT编译指南

    SRT(Secure,Reliable,Transport)是Haivision公司开发的一套开源媒体传输协议,用于在不稳定的网络环境下,优化媒体数据的传输性能.  SRT的码流加密基于开源库open ...

  4. 洛谷 P1547 Out of Hay (最小生成树)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1547 思路: 嗯...既然题中已经说了是最小生成树,那么是需要在最小生成树的模板上稍作修改即可.要 ...

  5. DHCP DHCPv6

    为了给网络客户机自动分配IP地址以及生成所需的配置参数,IETF分别给IPV4和IPV6网络定义了相关的协议标准,即DHCP(RFC2131)和DHCPV6(RFC3315),以及扩充的选项标准.本文 ...

  6. angular中[hidden]="expression"注意事项

    [hidden]="expression",右侧的表达式尽量使用布尔值:虽然比较运算符也可以达到效果,但时常会出现一些莫名其妙的错误.

  7. Luogu P4144 大河的序列 贪心+脑子

    首先向颜神犇致敬...还是自己太菜,又不仔细思考,上来就翻题解$qwq$ 首先有一种贪心方法:即,$ans=2*max(dirty_i)$ 证明:若现在的答案为$ans$,考虑一个新的数$x$对答案的 ...

  8. java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是

    答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...

  9. 全排列函数(next_permutation)

    顾名思义,这个函数就是用来求数组的全排列的,至于怎么用,看下面的介绍: 这是一个c++函数,包含在头文件algorithm里面,这个函数可以从当前的数组的大小按照字典序逐个递增的顺序排列 看下面的模板 ...

  10. Gym 100971D Laying Cables 二分 || 单调栈

    要求找出每个a[i],找到离他最近而且权值比它大的点,若距离相同,输出权利最大的那个 我的做法有点复杂,时间也要500+ms,因为只要时间花在了map上. 具体思路是模拟一颗树的建立过程,对于权值最大 ...