题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4899
容易发现树形结构是骗人的。。。走到错误分叉的影响是可以预处理的常数,所以就相当于一个序列从头走到尾的问题,那么可以预处理出对于每个点若在这里存档则走到其他点的期望步数
很容易想到f[i][j]表示走到第i个点,已经用了j个存档机会的最优值,那么枚举i前面的k进行转移,就是o(n*n*p)的复杂度。
然后你看这个方程长得这么simple一看就是要优化的对不对。。。观察一下上面说的每个存档点走到其他点期望步数的递推式,发现若从i走到j变为从i走到j+1,数值会乘以j的儿子数再加上一个只与j有关的数,而不受i影响。那么考虑对于两个决策点,随着待决策点的右移,离得远的那一个一定会增长得越来越快,所以决策点单调右移。于是就可以把复杂度降为o(n*log(n)*p)了。

#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
#define gm 701
using namespace std;
int T;
int n,m,p;
vector<int> s[1501];
double nex[1501],dis[gm][gm],f[gm][gm];
void dfs(int x)
{int d=s[x].size();if(!d) {nex[x]=1; return;}nex[x]=0;for(int i=0;i<d;++i){int y=s[x][i]; dfs(y);if(y>n) nex[x]+=(nex[y]+1)/d;}
}
typedef pair<int,int> pr;
vector<pr> kon[gm];
#define F(i,j,k) (f[i][j]+dis[i][k])
void push(int x,int y)
{vector<pr>& kre=kon[y];int top=kre.size();if(top==1) {kre.push_back(pr(x,n)); return;}if(F(x,y,n)-F(kre[top-1].first,y,n)>1e-6) return;while(top!=1){int va=kre[top-1].first,le=max(kre[top-2].second,x)+1;if(F(va,y,le)-F(x,y,le)>1e-6) --top,kre.pop_back();else break;}if(top==1) {kre.push_back(pr(x,n)); return;}int l=kre[top-2].second+1,r=n,v=kre[top-1].first;while(l!=r){int mid=l+r+1>>1;if(F(v,y,mid)-F(x,y,mid)>1e-6) r=mid-1;else l=mid;}kre[top-1].second=l;kre.push_back(pr(x,n));
}
struct cmp{bool operator() (const pr &a,int b) const {return a.second<b;}};
void calc(int x,int y)
{vector<pr>& kre=kon[y-1];if(kre.size()==1) return;vector<pr>::iterator it=lower_bound(kre.begin(),kre.end(),x,cmp());f[x][y]=F(it->first,y-1,x);push(x,y);
}
int main()
{scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&m,&p);for(int i=1;i<=m;++i) s[i].clear();for(int i=1;i<n;++i) s[i].push_back(i+1);for(int i=1;i<=p;++i) {kon[i].clear(); kon[i].push_back(pr(0,0));}for(int i=1;i<=m-n;++i){int u,v; scanf("%d%d",&u,&v);s[u].push_back(v);}dfs(1);for(int i=1;i<=n;++i){dis[i][i]=0;for(int j=i+1;j<=n;++j)dis[i][j]=s[j-1].size()*(dis[i][j-1]+nex[j-1])+1;}f[1][1]=0; push(1,1);for(int i=2;i<=n;++i)for(int j=min(p,i);j>=2;--j)calc(i,j);printf("%.4lf\n",f[n][p]);}return 0;
}

BZOJ4899: 记忆的轮廓 期望DP 决策单调性相关推荐

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

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

  2. [BZOJ4899]记忆的轮廓

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

  3. Bzoj4899 记忆的轮廓

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

  4. CF834D. The Bakery(线段树优化dp 决策单调性优化dp)

    linkkkkk 题意: 将一个长度为 n 的序列分为 m段,使得总价值最大. 一段区间的价值表示为区间内不同数字的个数. n≤35000,m≤50 思路: 考虑朴素的dpdpdp方程:dp[i][j ...

  5. bzoj 2216: [Poi2011]Lightning Conductor(DP决策单调性)

    2216: [Poi2011]Lightning Conductor Time Limit: 25 Sec  Memory Limit: 64 MB Submit: 1292  Solved: 443 ...

  6. BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp

    题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  7. bzoj 4709: [Jsoi2011]柠檬(分段DP+决策单调性)

    4709: [Jsoi2011]柠檬 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 240  Solved: 105 [Submit][Status ...

  8. bzoj2687 交与并(贪心+dp+决策单调性+分治)

    双倍经验:portal #include <cstdio> #include <cstring> #include <algorithm> #include < ...

  9. 【BZOJ4899】记忆的轮廓

    [题目链接] 点击打开链接 [思路要点] 预处理出costi,jcosti,jcost_{i,j}表示存档点i,ji,ji,j之间不存在其它存档点时,从iii走到j" role=" ...

最新文章

  1. hadoop-0.21.0 在Windows环境下的部署(1)Cygwin 安装
  2. 学会这二十个正则表达式,能让你少些1000行代码!
  3. 机器学习模型部署_9月版部署机器学习模型
  4. java命令行 引用jar包_java命令行引用jar包
  5. 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )
  6. 王琪你计算机学院,计算机学院“计忆时光”2019元旦联欢会暨年度颁奖典礼圆满举行...
  7. DevExpress v15.1:ASP.NET MVC功能升级(一)
  8. 关闭使用ShellExecute打开的进程
  9. UNIX 环境高级编程(七)—— 进程标识
  10. Java中的全局变量与局部变量
  11. LOJ2542 PKUWC2018随机游走(概率期望+容斥原理)
  12. WPS JS宏入门案例集锦
  13. python 调用淘宝客api
  14. 大数据教程(10.5)运营商流量日志解析增强
  15. Flash Builder常见菊紧问题集锦
  16. 给Ubuntu服务器安装图形化界面
  17. 安装程序无法更新计算机配置,无法安装某些更新或程序
  18. css音阶波浪动画图,线性渐变色
  19. java线程的停止,暂停,恢复*
  20. Printrun基础知识

热门文章

  1. 【潇湘菌子】redis常用命令 (常更)
  2. XSS小游戏通关题解
  3. Immo Tool ECU软件 可对发动机ECU和防盗锁进 行维修和编码
  4. Blender 移动模型到世界中心
  5. java考试题库用什么软件,这原因我服了
  6. 5分绩点转4分_5分制绩点计算器: 由于网上的绩点工具大多都是4分制的,而自己一门一门的计算绩点又非常麻烦,所以我就写了一个快速计算绩点的教程。...
  7. 视频教程-Cocos2d-x 游戏开发详解-Cocos
  8. PC-DMIS 2019 EROWA校验夹具外部坐标系
  9. ADO连接Access数据库,Access版本问题
  10. 计算机专业实习怎么找?大厂付费内推实习证明有用吗?