BZOJ4899 记忆的轮廓(概率期望+动态规划+决策单调性)
容易发现跟树没什么关系,可以预处理出每个点若走向分叉点期望走多少步才能回到上个存档点,就变为链上问题了。考虑dp,显然有f[i][j]表示在i~n中设置了j个存档点,其中i设置存档点的最优期望步数。转移枚举下一个存档点设在哪,则有f[i][j]=min(f[k][j-1]+d[i][k]),其中d[i][k]为从i号点存档点走到k号存档点其间没有别的存档点的期望步数。对d数组可以把一堆方程列出来手动加减消元得到式子,n2就可以求出。这样复杂度O(Tn3)。于是直接暴力就在darkbzoj上水过了。或者加一些乱七八糟的剪枝就能跑得飞快。然后有感性理解比较显然的一点是这个东西有决策单调性,于是就能做到O(Tn2logn)。证明估计得列一堆式子不太敢证了。然而由于d数组已经大到爆了精度,需要一些乱七八糟的处理,本来还以为是决策单调性写挂了调了半天一点卵用都没有。尽管这样还是没在bzoj上过掉,不知道bzoj有什么奇怪的精度问题。被恶心死了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 710
#define inf 1000000000
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int T,n,m,k,p[N<<],L[N],R[N],id[N],top,t;
double v[N<<],d[N][N],f[N][N],son[N<<];
struct data{int to,nxt;
}edge[N<<];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs(int k)
{
for (int i=p[k];i;i=edge[i].nxt)
{
son[k]++;
dfs(edge[i].to);
v[k]+=v[edge[i].to]+;
}
if (son[k]) v[k]/=son[k];
son[k]++;
}
double calc(int i,int x,int y){return f[i-][y]+d[x][y];}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4899.in","r",stdin);
freopen("bzoj4899.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
T=read();
while (T--)
{
n=read(),m=read(),k=read();
memset(p,,sizeof(p));t=;
memset(son,,sizeof(son));
memset(v,,sizeof(v));
for (int i=;i<=m-n;i++)
{
int x=read(),y=read();
addedge(x,y);
}
for (int i=;i<=n;i++) dfs(i),v[i]++;
for (int i=;i<n;i++)
{
double t=;
for (int j=i;j<n;j++)
{
d[i][j+]=d[i][j]+t/son[j]+t*(son[j]-)/son[j]*v[j];
t/=son[j];
}
t=;double s=;
for (int j=i;j<n;j++)
{
s-=t*(son[j]-)/son[j];
d[i][j+]/=s;
t/=son[j];
}
}
for (int i=;i<n;i++) f[][i]=inf;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
if (d[i][j]>inf) d[i][j]=1ll*inf*(j+);
for (int i=;i<=k;i++)
{
top=;id[]=n;L[]=,R[]=n-;
for (int j=n-;j>=;j--)
{
int l=,r=top,x=;
while (l<=r)
{
int mid=l+r>>;
if (L[mid]<=j&&R[mid]>=j) {x=mid;break;}
else if (L[mid]>j) l=mid+;
else r=mid-;
}
f[i][j]=calc(i,j,id[x]);
while (top&&R[top]<j&&calc(i,R[top],j)<calc(i,R[top],id[top])) top--;
l=L[top],r=min(j,R[top])-,x=L[top]-;
/*for (int p=r;p>=l;p--)
if (calc(i,p,j)<calc(i,p,id[top])) {x=p;break;}*/
while (l<=r)
{
int mid=l+r>>;
if (calc(i,mid,j)<calc(i,mid,id[top])) x=mid,l=mid+;
else r=mid-;
}
L[top]=x+;
if (x) top++,id[top]=j,L[top]=,R[top]=x;
}
}
/*for (int i=2;i<=k;i++)
for (int j=n-1;j>=1;j--)
{
f[i][j]=inf;
for (int x=j+1;x<=min(j+7+n/k,n);x++)
f[i][j]=min(f[i][j],calc(i,j,x));
}*/
printf("%.4f\n",f[k][]);
}
return ;
}
BZOJ4899 记忆的轮廓(概率期望+动态规划+决策单调性)的更多相关文章
- [BZOJ4899]:记忆的轮廓(概率DP)
题目传送门 题目描述: 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- BZOJ4899: 记忆的轮廓【概率期望DP】【决策单调性优化DP】
Description 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- [bzoj4899]记忆的轮廓 题解(毒瘤概率dp)
题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...
- Bzoj4899 记忆的轮廓
B. 记忆的轮廓 题目描述 通往贤者之塔的路上,有许多的危机.我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增,在[1,n]中,一共有n个节点.我 ...
- BZOJ1563 NOI2009诗人小G(动态规划+决策单调性)
设f[i]为前i行的最小不协调度,转移枚举这一行从哪开始,显然有f[i]=min{f[j]+abs(s[i]-s[j]+i-j-1-m)p}.大胆猜想有决策单调性就好了.证明看起来很麻烦,从略.注意需 ...
- 【题解】亚瑟王 HNOI 2015 BZOJ 4008 概率 期望 动态规划
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4008 一道不简单的概率和期望dp题 根据期望的线性性质,容易想到,可以算出每张卡的期望伤害, ...
- BZOJ5305 HAOI2018苹果树(概率期望+动态规划)
每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...
- BZOJ4832 抵制克苏恩(概率期望+动态规划)
注意到A+B+C很小,容易想到设f[i][A][B][C]为第i次攻击后有A个血量为1.B个血量为2.C个血量为3的期望伤害,倒推暴力转移即可. #include<iostream> #i ...
- UOJ#196. 【ZJOI2016】线段树 概率期望,动态规划
原文链接www.cnblogs.com/zhouzhendong/p/UOJ196.html 题解 先离散化,设离散化后的值域为 $[0,m]$ . 首先把问题转化一下,变成:对于每一个位置 $i$ ...
随机推荐
- 【JUC源码解析】FutureTask
简介 FutureTask, 一个支持取消行为的异步任务执行器. 概述 FutureTask实现了Future,提供了start, cancel, query等功能,并且实现了Runnable接口,可 ...
- asp.net core添加全局异常处理及log4net、Nlog应用
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍 此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录. 众所周知,一旦自己的项目报错,如果没有进行处 ...
- Scrapy爬取美女图片第四集 突破反爬虫(上)
本周又和大家见面了,首先说一下我最近正在做和将要做的一些事情.(我的新书<Python爬虫开发与项目实战>出版了,大家可以看一下样章) 技术方面的事情:本次端午假期没有休息,正在使用fl ...
- 解决WCF传输的数据量过大问题
今天写了个WCF接口,然后自测通过,和别人联调时报 远程服务器返回错误: (413) Request Entity Too Large 错误!记得以前写的时候也出现过这个错误,大致解决办 ...
- Cannot get connection for URL jdbc:oracle:thin:调用中无效参数
这个报错明显是连接数据库的url没有写对,但是,我要说的是但是,同样的代码生产没有问题,而测试环境报错了.最终哥找到那个错误,jdbc连接数据库时,有ResultSet,PreparedStateme ...
- selenium 各种很奇葩的异常
问题1:使用selenium3+java的脚本模拟登陆时,总是提示用户名,密码错误 解决方法:1 在执行输入用户名和密码的代码之前,加上driver.navigate().refresh(); QQ群 ...
- 搭建docker 私有镜像仓库
前期准备 服务器:centos 7.3 docker-ce: 18.06.1-ce docker-compose: 1.22.0 docker 安装 首先,更新系统 yum update yum up ...
- hdu - 6282,2018CCPC湖南全国邀请赛G题,字符串,规律
HDU – 6282 http://acm.hdu.edu.cn/showproblem.php?pid=6282 by Hzu_Tested 题意:给出两个字符串S和T,只由a,b,c三种字符组成( ...
- 简单主机批量管理工具(这里实现了paramiko 用su切换到root用户)
项目名:简单主机批量管理工具 一.需求 1.主机分组 2.可批量执行命令.发送文件,结果实时返回,执行格式如下 batch_run -h h1,h2,h3 -g web_clusters,db_ ...
- HTML5+Bootstrap 学习笔记 3
HTML5 aria-* and role aria是指Accessible Rich Internet Application.role的作用是描述一个非标准的tag的实际作用,而aria-*的作用 ...