博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mice and Holes 单调队列优化dp
阅读量:5108 次
发布时间:2019-06-13

本文共 1149 字,大约阅读时间需要 3 分钟。

Mice and Holes 单调队列优化dp

n个老鼠,m个洞,告诉你他们的一维坐标和m个洞的容量限制,问最小总距离。1 ≤ n, m ≤ 5000。

​ 首先列出朴素的dp方程:\(f[i][j]=min(f[i-1][k]+s[j]-s[k])\),其中\(f[i][j]\)表示前i个洞,有j个老鼠进洞。s[j]-s[k]表示第k+1到j个老鼠进洞的路径和。然后我们发现,\(f[i][j]\)的值取决于最小的\(f[i-1][k]-s[k]\ (k<=j)\),同时,j-k必须小于等于第i个洞的容量。于是我们建一个单调队列,队列存储最优的k。然后如果\(j-q[head]\)大于第i个洞的容量,那么head++,然后如果\(f[i-1][j]\)大于队列末尾,那么就一直tail--。这样就可以把\(O(n^3)\)的时间复杂度优化成O(n^2)。

​ 对了,初始化的时候要注意,想清楚没有优化的时候是什么样的状态。其实不难的。

#include 
#include
#include
typedef long long LL;const LL maxn=5005, INF=1e18;inline LL abs(LL x){ return x<0?-x:x; }struct Hole{ LL pos, cap; void set(LL x, LL y){ pos=x; cap=y; }}hole[maxn];bool cmp(const Hole &a, const Hole &b){ return a.pos
pre[i]) break; //不能让这个洞容纳更多老鼠 while (head
hole[i].cap) ++head; //单调队列,不是min的通通吃掉 while (head
<= fpre[queue[tail-1]]-s[queue[tail-1]]) --tail; queue[tail++]=j; fnow[j]=fpre[queue[head]]+s[j]-s[queue[head]]; } for (LL j=0; j<=n; ++j) fpre[j]=fnow[j]; } printf("%lld", fnow[n]);}

转载于:https://www.cnblogs.com/MyNameIsPc/p/7684938.html

你可能感兴趣的文章
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
Activiti入门 -- 环境搭建和核心API简介
查看>>
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
Java 多态 虚方法
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>