首页 > 其他分享 >dp 题 1

dp 题 1

时间:2024-04-20 21:57:40浏览次数:23  
标签:le min cdot 凸壳 mathcal kx dp

T1

Statement

你需要将 \(n(n\le10^6)\) 个数的序列 \(x\) 划分成若干连续段,设其中一段的所有数之和为 \(X\),那么这段的得分为 \(Y=aX^2+bX+c\),其中 \(a,b,c\) 已知,求划分得到的最大总得分。\(-5\le a\le-1,|b|,|c|\le10^7,1\le x_i\le100\)。

Solution

设 \(f_i\) 表示前 \(i\) 个数组成的序列能得到的最大总得分,\(f_0=0\);\(s_i\) 表示 \(x\) 的前缀和

转移思路:枚举当前段的左端点,计算总得分 \(\max\).

\[ \begin{aligned}f_i&=\max_{j=0}^{i-1}\{f_j+a(s_i-s_j)^2+b(s_i-s_j)+c\}\\&=a\cdot s_i^2+b\cdot s_i+c+\max_{j=0}^{i-1}\{f_j+a\cdot s_j^2-b\cdot s_j-2\cdot a\cdot s_i\cdot s_j\}\end{aligned} \]

记 \(y=f_j+a\cdot s_j^2-b\cdot s_j\),\(k=2\cdot a\cdot s_i\),\(x=s_j\)

即若把 \(i\) 固定,\(k\) 是常量,\(y\) 和 \(b\) 只与 \(j\) 相关;且 \(k\) 单调递减,\(x\) 单调递增.

有 \(f_i=a\cdot s_i^2+b\cdot s_i+c+\max_{j=0}^{i-1}\{y-kx\}\)

后面的 \(\max\{y-kx\}\) 可以通过维护上凸壳,从左往右走指针,变成总共 \(\mathcal O(n)\)

每次算完 \(f_i\),就用 \((x,y)\) 更新上凸壳

答案是 \(f_n\),时间复杂度 \(\mathcal O(n)\)

T2

Statement

有 \(n(n\le10^6)\) 个工厂分布在数轴上。第 \(i\) 个工厂的位置在 \(x_i(x_{i-1}<x_i)\),目前已有成品 \(p_i\) 件,在这个工厂建立仓库的费用是 \(c_i\)。

对于没有建立仓库的工厂,其产品只能运往编号更大的工厂的仓库,一件产品运送一个单位距离的费用是 \(1\)。问最小的总费用(建造费用 + 运输费用)。

Solution

设 \(f_i\) 表示前 \(i\) 个工厂的最小费用,其中第 \(i\) 个工厂必须建仓库;则 \(f_0=0,f_1=c_1\);

记 \(a_i\) 为 \(p_i\) 的前缀和,\(b_i\) 为 \(p_ix_i\) 的前缀和

转移思路:枚举运往 \(i\) 的工厂区间的左端点,取费用的 \(\min\).

\[ \begin{aligned}f_i&=c_i+\min_{j=0}^{i-2}\left\{f_j+\sum_{k=j+1}^{i-1}p_k(x_i-x_k)\right\}\\&=c_i+\min_{j=0}^{i-2}\left\{f_j+\sum_{k=j+1}^{i-1}p_kx_i-\sum_{k=j+1}^{i-1}p_kx_k\right\}\\&=c_i+\min_{j=0}^{i-2}\{f_j+x_i(a_{i-1}-a_j)-(b_{i-1}-b_j)\}\\&=c_i+x_ia_{i-1}-b_{i-1}+\min_{j=0}^{i-2}\{f_j+b_j-x_ia_j\}\end{aligned} \]

记 \(y=f_j+b_j\),\(k=x_i\),\(x=a_j\),则 \(x,y\) 只与 \(j\) 相关,\(k\) 只与 \(i\) 相关;\(k\) 单调递增,\(x\) 单调不递减;

且若把 \(i\) 固定,\(\min\) 前面的式子可以直接算,\(\min\) 后面的式子变成了 \(y-kx\) 形式,

可以通过维护 \(0\sim i-2\) 的 \((x,y)\) 组成的下凸壳,从左往右走指针的方式总共 \(\mathcal O(n)\) 地计算,

每次算完一个 \(f_i\) 就更新 \(i-1\) 对应的 \((x,y)\) 到下凸壳里面去.

答案:\(f_n\);时间复杂度:\(\mathcal O(n)\).

T3

Statement

\(N(N\le3\cdot10^5)\) 座山排成一排,第 \(i\) 座山有编号 \(P_i(1\le P_i\le N)\)、高度 \(H_i(H_i\le6\cdot10^5)\),且 \(P_i\) 互不相同,在 \(i<j\) 且 \(P_i<P_j\) 时你可以花费 \((H_i-H_j)^2\) 的能量从第 \(i\) 座山跳到第 \(j\) 座山,同时当处于第 \(i\) 座山时,还会花费 \(A_i(|A_i|\le10^9)\) 的能量,求从第一座山到达第 \(N\) 座山的最小能量花费。

Solution

设 \(f_i\) 为前 \(i\) 座山,从 \(1\) 跳到 \(i\) 的最小花费,则初始时有 \(f_1=A_1\),其余 \(f_i=+\infty\)

转移思路:枚举从哪座山直接跳到第 \(i\) 座山,取花费的 \(\min\).

\[ \begin{aligned}f_i&=\min_{j\in[1..i-1]\land P_j<P_i}\left\{A_i+(H_i-H_j)^2+f_j\right\}\\&=\min_{j\in[1..i-1]\land P_j<P_i}\left\{A_i+H_i^2-2H_iH_j+H_j^2+f_j\right\}\\&=A_i+H_i^2+\min_{j\in[1..i-1]\land P_j<P_i}\left\{H_j^2+f_j-2H_iH_j\right\}\end{aligned} \]

记 \(y=H_j^2+f_j\),\(k=2H_i\),\(x=H_j\),则 \(x,y\) 只与 \(j\) 相关,\(k\) 只与 \(i\) 相关;

且若把 \(i\) 固定,\(\min\) 外面的式子可以直接求,\(\min\) 里面成为了 \(y-kx\),若维护出了所有满足条件的 \(j\) 对应的 \((x,y)\) 所组成的下凸壳,可以直接在下凸壳上二分 \(\mathcal O(\log n)\) 地找到答案;

而计算出当前 \(f_i\) 后还需要把它对应的 \((x,y)\) 加入下凸壳的候选点中.

问题变成了:维护 \(j<i\) 且 \(P_j<P_i\) 的所有点组成的下凸壳,每次询问过下凸壳的每个点作斜率为 \(k\) 的直线与 \(y\) 轴的截距的最小值.

经典的扫描线问题,可以用一棵线段树或树状数组维护,每个节点对应一棵平衡树,这里以线段树为例:

  • 一个节点 \([l,r]\) 维护所有编号 \(P_k\) 在 \([l,r]\) 内的点对应的 \((x_k,y_k)\) 组成的下凸壳
  • 每次询问的是线段树中一段前缀区间 \([1..P_i-1]\) 对应的下凸壳的每个点作出斜率为 \(k\) 的直线的 \(y\) 轴截距 \(\min\)
  • 对于涉及的 \(\mathcal O(\log n)\) 个节点,每个节点二分找到当前下凸壳的截距 \(\min\),合并时直接取 \(\min\)
  • 算完当前 \(f_i\),就将当前点加入到线段树 \(P_i\) 位置
  • 加入一个点时对于涉及的 \(\mathcal O(\log n)\) 个节点,每个点先二分找到插入位置,若能更新则对旁边的点进行删除直到再次变成凸包

无论是插入还是查询都是 \(\mathcal O(\log^2n)\) 的,总共 \(\mathcal O(n\log^2n)\)

注意,若没有满足条件的 \(j\),那么 \(f_i\) 还是 \(+\infty\);答案是 \(f(n)\).

也可以用线段树/树状数组套李超树维护

标签:le,min,cdot,凸壳,mathcal,kx,dp
From: https://www.cnblogs.com/laijinyi/p/18148239/Dps-1

相关文章

  • 数位 dp 题
    T1Statement任意相邻两个数字之差至少为\(2\)的正整数被称为windy数。给出\(A,B(A\leB\le2\times10^9)\),求\([A..B]\)中有多少个windy数。Solution我们使用记忆化搜索实现。\(f(i,x,a,b)\)表示还有\(i\)位需要确定,上一位数字为\(x\),是否达到上限,是否不含前导......
  • 《算法竞赛进阶指南》 第六章 291. 蒙德里安的梦想 状态压缩DP
    https://www.acwing.com/problem/content/293/求把N×M的棋盘分割成若干个1×2的长方形,有多少种方案。例如当N=2,M=4时,共有5种方案。当N=2,M=3时,共有3种方案。如下图所示:输入格式输入包含多组测试用例。每组测试用例占一行,包含两个整数N和M。当输入用例N=0......
  • 2023 5月 dp做题记录
    目录5月dp做题记录P1064[NOIP2006提高组]金明的预算方案P1941[NOIP2014提高组]飞扬的小鸟P2679[NOIP2015提高组]子串P1850[NOIP2016提高组]换教室P2831[NOIP2016提高组]愤怒的小鸟P5020[NOIP2018提高组]货币系统P6064[USACO05JAN]NaptimeGP9344去年天......
  • 2023 6月 dp做题记录
    目录6月dp做题记录P5664[CSP-S2019]Emiya家今天的饭P8867[NOIP2022]建造军营[ARC115E]LEQandNEQP3800Power收集P3594[POI2015]WIL6月dp做题记录P5664[CSP-S2019]Emiya家今天的饭分析条件,我们要选出来的菜的集合需要满足的限制,集合不为空和烹饪方法互不相同都好......
  • 2023 7月 dp做题记录
    目录7月dp做题记录TheBakeryP5785[SDOI2012]任务安排P3195[HNOI2008]玩具装箱P3648[APIO2014]序列分割7月dp做题记录TheBakery这道题的状态转移并不难列,经典的分段问题,设状态\(dp_{i,j}\)表示前\(i\)个数字分了\(j\)段的最大价值,转移可以写成\(dp_{i,j}=\max(......
  • [dpdk] rte_flow
     以下内容直接来自官网文档的整理。更精准的描述请阅读文档:https://doc.dpdk.org/guides/prog_guide/rte_flow.html一rte_flow是干嘛的一组用来创建自定义规则的api,该规则可以改变网络流量的命运,以及查询计数。 二规则啥样1match+actionmatch包括:两类,A报文内容(按......
  • 区间dp思想
    删数链接:https://www.luogu.com.cn/problem/P2426题目描述有\(N\)个不同的正整数\(x_1\),\(x_2\),...,\(x_N\)排成一排,我们可以从左边或右边去掉连续的\(i\)\((1\lei\len)\)个数(只能从两边删除数),剩下\(N-i\)个数,再把剩下的数按以上操作处理,直到所有的数都被删......
  • 概率dp四题(青蛙跳、吸血鬼、rating、k小姐的点赞之谜)
    青蛙跳Description有\(n\)个荷叶按顺序依次排列开,编号为\(1\)到\(n\),现在有只青蛙在编号为\(n\)的荷叶上。它现在自由愉快的跳跃,如果他在编号为\(i\)的荷叶上,它会等概率的跳到编号为\([1,i]\)的荷叶上,求它跳到编号为\(1\)的荷叶上的期望步数。Samples53.083333......
  • [dp 小计] wqs 二分
    天才算法!国外叫Alienstrick(外星人trick),真的太强了。其实是因为IOI2016Aliens这道题考了这个算法才开始普及。解决问题wqs二分一般用来解决如下问题。给定\(n\)个数,求强制选\(m\)个的价值最大。如果不是强制选\(m\)个,这类问题很好做。现在问题就是怎么取消......
  • Pyecharts制作动态GDP柱状图
    学习使用pyecharts制作动态柱状图使用csv模块进行csv数据文件处理importcsvfrompyecharts.chartsimportBar,Timelinefrompyecharts.optionsimport*frompyecharts.globalsimportThemeTypedefdealCSVFile():"""读取处理csv数据文件:retu......