首页 > 其他分享 >DP杂谈【持续更新中】

DP杂谈【持续更新中】

时间:2023-05-18 20:45:18浏览次数:42  
标签:le sum 杂谈 更新 任务 DP 序列 dp

什么是DP?

推荐看一下。

正文

滚动数组优化

在一些空间贼小,时间还好的 DP 题目里,会用到优化空间的小技♂巧——滚动数组优化。

滚动数组,顾名思义,一个会滚动的数组,主要是怎样个滚法呢?接下来我先举一个例子:

e.g

最长公共子序列(LCS)

给出两个整数序列,求这两个序列的†最长公共子序列。
†最长公共子序列:多个序列的共有的最长子序列。

这道题我们不难发现:
我们设 \(f_{i,j}\) 为从 \(1\) 到 \(i\) 的 \(a\) 子序列和从 \(1\) 到 \(j\) 的 \(b\) 子序列的 \(LCS\)。
它的状态转移方程即为

\[f_{i,j}= \begin{cases} f_{i-1, j-1} + 1 & a[i]=b[j] \\ max(f_{i-1,j},f_{i,j-1}) & a[i]\ne b[j] \end{cases} \]

我们发现,状态 \(f_{i,j}\) 只依赖于 \(f_{i-1,\dots}\) 和 \(f_{i,\dots}\),那么既然 \(i-2\) 及以后的状态都没用了,那么我们可以把那之前的状态给滚掉,即把第一维套上个 \(\% 2\),思考一下,这里十分的巧妙。

因为 \(mod\) 常数很大,我们为了优化常数,可以使用位运算,即 \(i\% 2\rightarrow i\&1\),\((i-1)\% 2\rightarrow (i\oplus1)\&1\)

这样我们将巨大的 \(O(n^2)\) 的空间压缩到了 \(O(n)\)。

费用提前计算

在一些题目里,它状态的每一次转移都会产生后效性,所以用普通的DP是做不了的,那么,我们如何解决这个问题呢?

这时,我们有一种策略,就是既然我已经知道未来会被现在影响,那么为什么我不先把将要影响的算了呢?这,就是费用提前计算。

e.g

Luogu 2365 任务安排
题目描述
\(n\) 个任务排成一个序列在一台机器上等待完成(顺序不得改变),这 \(n\) 个任务被分成若干批,每批包含相邻的若干任务。
从零时刻开始,这些任务被分批加工,第 \(i\) 个任务单独完成所需的时间为 \(t_i\)。在每批任务开始前,机器需要启动时间 \(s\),而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完成)。
每个任务的费用是它的完成时刻乘以一个费用系数 \(f_i\)。请确定一个分组方案,使得总费用最小。
对于 \(100\%\) 的数据,\(1\le n \le 5000\),\(0 \le s \le 50\),\(1\le t_i,f_i \le 100\)。

我们先设 \(dp_i\) 为前 \(i\) 天的答案,\(time_i\) 为前 \(i\) 天完成后的时间,经过手玩样例过后发现状态转移方程为:

\[dp_i=min\{dp_j+(time_j+s+\sum^i_{k=j+1}t_{k})*\sum^i_{k=j+1}f_k\} \]

对于 \(time_j\),我们可以表示为:

\[time_j = \sum^j_{k=1}t_k\times f_k+num*s \]

※ \(num\) 为前 \(i\) 天做的次数。

怎么处理 \(num\) 呢?考虑到在每次做任务时,都会使当前和以后计算的时间加上 \(s\),先不管转移方程,我们现在对未来的影响为:

\[\sum^n_{k=j+1}s\times f_k=s\times\sum^n_{k=j+1} f_k \]

于是我们可以列出一个船新的状态转移方程:

\[dp_i=min\{dp_j+\sum^i_{k=1}t_k\times\sum^i_{l=j+1}f_l+s\times\sum^n_{k=j+1} f_k\} \]

因为我们在过去已经计算了影响现在的值,所以我们只需要计算 \(\sum^i_{k=1}t_k\)。以上的各种 \(\sum\) 均可以用前缀和优化为 \(O(1)\) 的,所以时间复杂度为 \(O(n^2)\)。

数位DP

数位DP主要解决的是有关每个数位上的数字的一些关系,这种DP比较容易辨认,大多是一眼题,形如:

求 \(l\) 到 \(r(1\le l,r\le 10^{18})\) 中满足以下性质的数的个数:

每个数位.........

我们可以使用类似前缀和的思想,设 \(dp(i)\) 为 \(1\) 到 \(i\) 一共满足性质的数的个数,答案即为 \(dp(r) - dp(l-1)\)。

发现可以对于一个已经固定最高位了的任意满足条件的 \(k\) 位数的数量进行预处理,但是这个做法会假掉,原因:先设原数等于 \(\overline{kabcd\cdots e}\)(\(x\) 位数),则我们在处理满足性质的最高位为 \(k\) 的 \(x\) 位数的个数可能会包含超出原数范围的数,但是这部分的数是不可取的,并且难以维护 \(\overline{kabcd\cdots e}\) 以内的满足性质的最高位为 \(k\) 的 \(x\) 位数的个数,所以做法假了。

注意到最高位小于 \(k\) 时,我们是可以使用上文预处理的方法的,于是我们可以分类讨论:


列出以上树形图

对于左边的分支,我们可以直接用先前预处理出来的值来更新 \(ans\),对于右边的分支,继续往下走,记录一下前面数位的情况,再针对前面的数位来进行下一位的转移。

e.g.

AcWing 1081度的数量
求给定区间 \([X,Y]\) 中满足下列条件的整数个数:这个数恰好等于 \(K\) 个互不相等的 \(B\) 的整数次幂之和。
例如,设 \(X=15,Y=20,K=2,B=2\),则有且仅有下列三个数满足题意:
\(17=24+20\quad 18=24+21\quad 20=24+22\)

标签:le,sum,杂谈,更新,任务,DP,序列,dp
From: https://www.cnblogs.com/Raining-Hard/p/17386621.html

相关文章

  • CentOS 7 安装 WordPress
    参考0:https://blog.csdn.net/abcd5711664321/article/details/122554412参考1:https://www.yii666.com/article/551970.html参考2:https://www.cnblogs.com/yanans/p/12945001.html  修改文件/etc/httpd/conf/httpd.conf(一行不改也可以) 一行不改,原来是这样的   ......
  • ubuntu更新软件源命令有哪些
    ubuntu更新软件源命令有:1、apt-getupdate,更新系统软件源;2、apt-getupgrade,更新升级所有软件;3、apt-getupgrade软件名,更新某个软件。具体ubuntu更新软件源命令有以下几种:1.更新系统软件源的命令。apt-getupdate2.更新升级所有软件的命令。apt-getupgrade3.更新某个软......
  • RTSP over UDP与RTSP over TCP取流对比(转)
    addbyzhj: 我用FFmpeg从RTSP拉摄像头的流,日志级别设置-vtrace,可以看到这些消息。默认的,FFmpeg使用UDP传输媒体数据,如果想用TCP传输媒体数据,需要指定参数-rtsp_transporttcp,亲测。原文:https://blog.csdn.net/luyumiao1990/article/details/106093001作者:luyumiao1990网站:C......
  • 由win11更新系统win10
    问题描述需要将win11的系统更换为win10,且保留电脑中软件(labview,mysql,向日葵等)解决方法1,将C盘软件需要备份的备份到D盘或除C盘以外的2,在百度输入itellyou下载官方win10,先下载迅雷,再复制BT下载会快一些3,进行安装4,安装成功可以在D盘安装软件,注:如果mysql安装到D盘不需要再进......
  • B. Fake Plastic Trees(贪心+dp)
    题目(FakePlasticTrees)[https://codeforces.com/problemset/problem/1693/B]题意输入T(≤1e3)表示T组数据。所有数据的n之和≤2e5。每组数据输入n(2≤n≤2e5)表示一棵n个节点的树,编号从1开始,1为根节点。然后输入p[2],p[3],...,p[n],其中p[i]表示i的父节......
  • cdr最新2023版本发布更新CorelDRAW 2023下载mac/win
    CorelDRAW2023是一款矢量图形设计软件,由CorelCorporation开发。它提供了一系列强大的工具和功能,可以帮助用户创建专业级的图形设计作品,如标志、海报、名片、包装和插图等。CorelDRAW2023的主要功能包括矢量图形编辑、图形排版、颜色管理和输出预览等。它还提供了智能对象、......
  • 使用bandpass Butterworth filter对信号数据进行滤波去噪
    在信号处理中,有些信号会包含大量的噪声,需要用一些滤波器去噪,本文介绍使用bandpassButterworthfilter进行去噪。直接使用sciPypython库可以实现噪声滤波步骤1:导入所需python模块fromscipy.signalimportfiltfiltfromscipyimportstatsimportCSVimportpandasaspdim......
  • 概述 .NET ThreadPool 实现
    基本调度单元IThreadPoolWorkItem实现类的实例。Task全局队列本地队列偷窃机制线程注入实验.NET5实验一默认线程池配置.NET5实验二调整ThreadPool设置.NET5实验三tcs.Task.Wait()改为Thread.Sleep.NET6实验一默认ThreadPoo......
  • 单调队列优化dp
    单调队列优化dp对于一些比较简单的题目,我们可以直接凭借经验进行优化。但是对于类似\(max(f[j-kw]+kv)\)(多重背包)我们就很难凭借经验找到优化方式了这个时候,我们就可以尝试一下下面的方法:我们观察一些简单的,可以单调队列优化的方程,他们都有这样的形式:\(max/min(g[i-k])(L\l......
  • kube-proxy修改日志级别并观察endpoint变化
    k8sv1.15.0修改日志级别keditdskube-proxy-nkube-system增加kube-system命名空间下corednsPodkgetendpointskube-dns-nkube-system-oyaml持续输出kube-proxy日志dockerlogs-f`dockerps|grepkube-proxy|grep-vpause|awk'{print$1}'`pkg/prox......