题目:

https://loj.ac/problem/6171

分析:

设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数

那么

a[i][k]表示i点为存档点,从i点走到k点(正确节点)的期望步数(中间没有其它存档点)

那么a[i][j]可以递推预处理出

其中g[v]表示从一个错误节点v开始走,期望走g[v]步会读档

解方程可以解出

s[j-1]就是点j-1出去的所有错误儿子的g[v]之和

那么接下来只要知道如何求g[v]就行了

这个直接dfs一遍就行了

好,那么现在我们的主dp就可以求解了

但是直接dp的复杂度是O(n^2p)的,这样会TLE

方法一:

注意到这个dp的本质是把一个序列给分成p段,那么其中某一段会不会很长呢?

我们会发现a的增长是非常快的,而最终的答案不会很大,所以也就是说当前的i的最优转移j,不会离i太远

所以通过计算可以发现这个距离step<=40

所以时间复杂度O(40n^2)

方法二:

考虑dp优化的惯用套路

容易得出此dp是决策单调的,也就是f(i)<=f(i+1)

那么就可以决策单调优化O(nplogn)

具体的就维护一个队列,队列里每个元素存着[l,r,p]表示区间l~r,当前最优决策是p

每次从队头取出最优策略,将此次新的决策从队尾开始放入并合并区间

         dp[][n]=0.0;
for(int now=;now<=number;++now)
{
int head=,tail=;
q[]={,n-,n};
for(int i=n-;i>=;--i)
{
while(head<tail&&q[head].l>i) ++head;
dp[now][i]=cal(now-,i,q[head].p);
while(head<tail&&cal(now-,q[tail].r,i)<cal(now-,q[tail].r,q[tail].p)) --tail;
int position=find(now,q[tail].l,q[tail].r,i,q[tail].p);
if(position)
{
q[tail+]={,position,i};
q[tail].l=position+;
if(q[tail].l>q[tail].r) ++head;
++tail;
}
}
}

方法三:

一个很神奇的二分套路(详见王钦石《浅析一类二分方法》)

这是一个限制段数的dp,我们把它写成不限制段数的情况

然后我们去二分一个常数C,使得式子变成这样

这里的C表示每次重新开一段所需要的代价

很明显,C越大,最优情况下分的段数就越少,C越小,最优情况下分的段数就越多

所以我们可以二分C,对于每个C,进行dp

通过n->pre[n]->pre[pre[n]]->...->1,我们可以知道存了多少次档,当存档数恰好等于p的时候,此时对应的划分方案就是读档p次时候的最优解,就是将dp的最优值减去C*p

但是有个trick,王钦石论文里也提到了

就是可能当前eps下,并没有哪个C会使得我恰好读了p次档,即某个C情况下,我读了p-1次档,在C-eps情况下,我读了p+1次档,就是没有读p次档

这时候有个结论就是C-eps时,我读p+1次档这个情况下也必定有我读p次档的解,此时原本答案是dp-(p+1)*C,现在这样改成读p次档之后,答案就是dp-p*C

这样复杂度是O(n^2logA)

当然这里的dp可以优化,但不过预处理的时候O(n^2)是跑不掉的,所以再优化也不会低于O(n^2)的复杂度

         int minnum=m+;
while (l+eps<=r)
{
long double mid=(l+r)/;
int num=check(mid);
long double sum=;
for(int now=n;now!=;now=pre[now]) sum+=w[pre[now]][now];
if (num<=p)
{
if (num==p)
{
ans=sum;
break;
};
r=mid-eps;
}
else
{
if(num<=minnum)
{
ans=sum+(num-p)*mid;
minnum=num;
}
l=mid+eps;
}
}

loj6171/bzoj4899 记忆的轮廊(期望dp+优化)的更多相关文章

  1. [BZOJ4899]:记忆的轮廓(概率DP)

    题目传送门 题目描述: 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...

  2. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  3. 【bzoj1415】【聪聪和可可】期望dp(记忆化搜索)+最短路

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57148470 Descrition 首先很明显是 ...

  4. 【CodeM初赛B轮】F 期望DP

    [CodeM初赛B轮]F 题目大意:有n个景点,m条无向边,经过每条边的时间需要的时间是li,在第i个景点游览花费的时间是ti,游览完第i个景点可以获得的满意度是hi.你的总时间为k,起初你等概率的选 ...

  5. bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索

    期望dp水题~ 你发现每一次肯定是贪心走 2 步,(只走一步的话就可能出现环) 然后令 $f[i][j]$ 表示聪在 $i$,可在 $j$,且聪先手两个人碰上面的期望最小次数. 用记忆化搜索转移就行了 ...

  6. 洛谷4206/NOI2005T4 聪聪和可可 期望DP+记忆化搜索

    题意:给出n个点m条边的无向图,两个主角聪聪和可可开始分别在S点和T点.聪聪想吃掉可可,每次由匆匆先行动后来可可行动.聪聪的行动是选他到可可的最短路上的点走最多两步(如果最短路有几条就选编号最小的走) ...

  7. 【BZOJ-4008】亚瑟王 概率与期望 + DP

    4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 832  Solved: 5 ...

  8. 【期望DP】

    [总览] [期望dp] 求解达到某一目标的期望花费:因为最终的花费无从知晓(不可能从$\infty$推起),所以期望dp需要倒序求解. 设$f[i][j]$表示在$(i, j)$这个状态实现目标的期望 ...

  9. [SCOI2008]奖励关(期望dp)

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

随机推荐

  1. EOS Dapp体验报告

    EOS Dapp体验报告 EOS通过并行链和DPOS的方式解决了延迟和数据吞吐量的难题. EOS能够实现每秒百万级的处理量,而目前比特币是每秒7笔,以太坊是30-40笔,EOS的这一超强能力吊打比特币 ...

  2. iview table 普通表格样式

    iview table 普通表格样式 https://run.iviewui.com/UvLFPMb0 <template> <table> <thead> < ...

  3. IntelliJ IDEA使用eclipse compiler(ecj)解决lombok编译问题

    1:为什么要使用在idea使用eclipse compiler(ecj)? 因为idea默认使用javac,而javac当在编译时发现一个编译错误就直接停止编译了.而ecj支持proceed on e ...

  4. node程序的部署神器pm2的基本使用

    pm2是从nodejs衍生出来的服务器进程管理工具,可以做到开机就启动nodejs.当然了,也可以用nohup来做这件事情的. 前言 众所周知,Node.js运行在Chrome的JavaScript运 ...

  5. 全新Ubentu系统没有make,gcc命令解决办法

    一定要记得先update sudo apt-get update 然后输入下述命令即可 sudo apt-get install make sudo apt-get install gcc

  6. INFORMATION_SCHEMA 表

    INFORMATION_SCHEMA 表 INFORMATION_SCHEMA 简介 INFORMATION_SCHEMA.CHARACTER_SETS INFORMATION_SCHEMA.COLL ...

  7. python_time和datetime模块

    time和datatime模块 时间相关的操作,时间有三种表示方式: 时间戳               1970年1月1日之后的秒,即:time.time() 格式化的字符串    2019-1-1 ...

  8. 【HIHOCODER 1049】 后序遍历

    描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具--一棵由小球和木棍连接起来的二叉树! 小Ho对这棵二叉树爱不释手,于是给它的每一个节 ...

  9. Vijos 1308 埃及分数(迭代加深搜索)

    题意: 输入a.b, 求a/b 可以由多少个埃及分数组成. 埃及分数是形如1/a , a是自然数的分数. 如2/3 = 1/2 + 1/6, 但埃及分数中不允许有相同的 ,如不可以2/3 = 1/3 ...

  10. python练习——小程序

    1.打印0-10(while/for) count = 0 while count < 11: print(count) count += 1 for i in range(11): print ...