BZOJ 4899 记忆的轮廓
话说BZOJ 是不是死了啊
(已经没有传送门了)
设 $f[i][j]$ 表示走到第 $j$ 个位置确定了 $i$ 个存档点时的最小代价,并强制第 $j$ 个位置有一个存档点
那么设 $cst[i][j]$ 表示存档点在 $i$ ,走到位置 $j$ 的代价, $f$ 有转移:
$f[i][j]=f[i-1][k]+cst[k][j]$
考虑 $cst[i][j]$ 如何计算,对每个起点 $i$ 求出 $i$ 指向的错误节点 $v$ 重新走回 $i$ 的期望步数 $dis[v]$,这个可以简单树形 $dp$ 得到
那么设 $val=\sum_{v \in son(j-1)} (cst[i][j-1]+1+dis[v])$ ,那么有 $cst[i][j]=cst[i][j-1]+1+val$
这里 $val$ 意义显然为从 $j-1$ 走到 $j$ 的期望代价,因为从 $j-1$ 到各个后继的概率一样,所以期望就是把每个后继各走一遍
加上 $cst[i][j-1]+1$ 显然是因为存档点在 $i$ ,要走到 $j-1$ 的后面一个儿子代价就是 $cst[i][j-1]+1$
然后这样就可以 $n^3$ 跑 $dp$ 了,考虑如何优化
把 $cst$ 的表打出来发现 $cst[i][j]$ 比 $cst[i][j-1]$ 的值大很多,发现 $cst$ 增长很快,显然超过一次函数
那么对于 $a<b<c<d$ ,就有 $cst[a][c]+cst[b][d]<=cst[a][d]+cst[b][c]$,即满足四边形不等式
所以对于 $f[i][j]$ 的最优转移点 $k$ ,$f[i][j+1]$ 的最优转移点一定不小于 $k$(不然我们直接从 $f[i-1][k]$ 转移会更优,写写式子就知道了)
然后用决策单调性分治优化即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
typedef double db;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=;
const db INF=1e99;
int T,n,m,p;
vector <int> V[N];
db f[N][N],cst[N][N],dis[N];
void dfs(int x,int fa)
{
int sz=V[x].size();
if(sz==) { dis[x]=; return; }
dis[x]=;
for(int i=;i<sz;i++)
{
int &v=V[x][i]; if(v==fa) continue;
dfs(v,x); dis[x]+=dis[v]+;
}
dis[x]/=sz-;
}
void solve(int i,int l,int r,int ql,int qr)
{
int mid=l+r>>,pos=ql,R=min(qr,mid-); f[i][mid]=INF;
for(int k=ql;k<=R;k++)
{
db val=f[i-][k]+cst[k][mid];
if(val<f[i][mid]) f[i][mid]=val,pos=k;
}
if(l<mid) solve(i,l,mid-,ql,pos);
if(mid<r) solve(i,mid+,r,pos,qr);
}
int main()
{
T=read();
while(T--)
{
n=read(),m=read(),p=read();
for(int i=;i<=m-n;i++)
{
int a=read(),b=read();
V[a].push_back(b); V[b].push_back(a);
}
for(int i=;i<=n;i++)
for(auto A: V[i]) dfs(A,i);
for(int i=;i<=n;i++)
{
cst[i][i]=;
for(int j=i+;j<=n;j++)
{
cst[i][j]=cst[i][j-]+;
for(auto A: V[j-])
cst[i][j]+=cst[i][j-]+ + dis[A];
}
}
f[][]=; for(int i=;i<=n;i++) f[][i]=INF;
for(int i=;i<=p;i++)
solve(i,,n,,n);
printf("%.4lf\n",f[p][n]);
for(int i=;i<=m;i++) V[i].clear();
}
return ;
}
BZOJ 4899 记忆的轮廓的更多相关文章
- bzoj 4899 记忆的轮廓 题解(概率dp+决策单调性优化)
题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...
- [BZOJ4899]:记忆的轮廓(概率DP)
题目传送门 题目描述: 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- [bzoj4899]记忆的轮廓 题解(毒瘤概率dp)
题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...
- Bzoj4899 记忆的轮廓
B. 记忆的轮廓 题目描述 通往贤者之塔的路上,有许多的危机.我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增,在[1,n]中,一共有n个节点.我 ...
- 记忆的轮廓 期望 四边形不等式dp|题解
记忆的轮廓 题目描述 通往贤者之塔的路上,有许多的危机.我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增,在[1,n]中,一共有n个节点.我们把编 ...
- BZOJ4899 记忆的轮廓(概率期望+动态规划+决策单调性)
容易发现跟树没什么关系,可以预处理出每个点若走向分叉点期望走多少步才能回到上个存档点,就变为链上问题了.考虑dp,显然有f[i][j]表示在i~n中设置了j个存档点,其中i设置存档点的最优期望步数.转 ...
- BZOJ4899: 记忆的轮廓【概率期望DP】【决策单调性优化DP】
Description 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- 决策单调性优化dp 专题练习
决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...
随机推荐
- 在Linux下使用rm -rf /*后会怎样?
每个工作过的码农,也许不知道分布式,也许不知道高并发,但想必都知道这句鼎鼎大名的代码.本人对此也是比较好奇的,不妨用虚拟机试试看 首先是普通角色: 普通角色把拥有权限的文件全都删掉了后,其他文件的提示 ...
- 简述python中的@staticmethod作用及用法
关于@staticmethod,这里抛开修饰器的概念不谈,只简单谈它的作用和用法. staticmethod用于修饰类中的方法,使其可以在不创建类实例的情况下调用方法,这样做的好处是执行效率比较高.当 ...
- Qt串口通信专题教程
查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...
- matlab gui界面设计记录
我们要进行的程序是彩色图像处理试验示例,用这个程序来练习我们的gui前台设计. 程序功能介绍:具有彩色图像处理及保存和音乐播放功能效果如下图 2 在MATLAB的命令窗口中输入guide命令,打开gu ...
- SpringCloud(二)之Ribbon的实现负载均衡的基本应用
一 Ribbon简介 Ribbon是Netflix发布的负载均衡器,它是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装 ...
- LuceneUtil使用反射,封装通用的方法
package loaderman.util; import java.io.File; import java.lang.reflect.Method; import loaderman.entit ...
- 各种集合key,value能否为null
转: 各种集合key,value能否为null 2019年03月12日 13:22:58 mingwulipo 阅读数 238 HashMap key,value都可以为null static f ...
- ZUK Z2 AospExtended-v6.7 Android 9.0可用的谷歌相机Mod.md
目录 参考资料 系统版本: AospExtended-v6.7-z2_plus-20190821-1940-OFFICIAL.zip cstark27 ×PXv4.1.1_GoogleCamera_7 ...
- Linux命令行如何返回上一次的目录
千辛万苦进入了一个很深层的目录,一不小心输入了cd并回车 ......... 并不是再进一次,对于bash来说,只需要很管理的一个命令: cd - 该命令等同于cd $OLDPWD,关于这一点在bas ...
- MATLAB学习(二)读写xls文件
>> N=xlsread('DRINK.xls','DRINK','A1:D8') N = 207.2000 3.3000 15.5000 2.8000 36.8000 5.9000 12 ...