树形数位动态规划_黄哲威
动态规划.pdf

第三章:动态规划3.1 动态规划的基本概念一、动态决策问题:决策过程具有阶段性和时序性(与时间有关)的决策问题。
即决策过程可划分为明显的阶段。
二、什么叫动态规划(D.P.–Dynamic Program):多阶段决策问题最优化的一种方法。
广泛应用于工业技术、生产管理、企业管理、经济、军事等领域。
三、动态规划(D.P.)的起源:1951年,(美)数学家R.Bellman等提出最优化原理,从而建立动态规划,名著《动态规划》于1957年出版。
四、动态决策问题分类:1、按数据给出的形式分为:•离散型动态决策问题。
•连续型动态决策问题。
2、按决策过程演变的性质分为:•确定型动态决策问题。
•随机型动态决策问题。
五1、阶段(stage)n :作出决策的若干轮次。
n = 1、2、3、4、5。
2、状态(state)S n :每一阶段的出发位置。
构成状态集,记为S nS 1={A},S 2={B 1,B 2,B 3},S 3={C 1,C 2,C 3},S 4={D 1,D 2,D 3},S 5={E 1,E 2}。
阶段的起点。
3、决策(decision)X n :从一个阶段某状态演变到下一个阶段某状态的选择。
构成决策集,记为D n (S n )。
阶段的终点。
D 1(S 1)={X 1(A)}={B 1,B 2,B 3}= S 2,D 2(S 2)={X 2(B 1),X 2(B 2),X 2(B 3)}={C 1,C 2,C 3}=S 3,D 3(S 3)={X 3(C 1),X 3(C 2),X 3(C 3)}={D 1,D 2,D 3}=S 4,D 4(S 4)={X 4(D 1),X 4(D 2),X 4(D 3)}={E 1,E 2}=S 5D 5(S 5)={X 5(E 1),X 5(E 2)}={F;F}={F}。
4、策略(policy):全过程中各个阶段的决策Xn 组成的有序总体{Xn }。
如 A àB2àC1àD1àE2àF5、子策略(sub-policy):剩下的n个阶段构成n子过程,相应的决策系列叫n子策略。
动态规划方案学习速成攻略与实践案例

动态规划方案学习速成攻略与实践案例一、前言大家好,今天我来给大家分享一份关于动态规划的学习攻略和实践案例。
动态规划是算法领域的一种重要技术,广泛应用于各种场景,如最长公共子序列、背包问题、最长递增子序列等。
掌握动态规划,不仅可以提高解决问题的效率,还可以提升自己的编程能力。
我们就一起走进动态规划的世界,探寻其中的奥秘。
二、动态规划学习攻略1.理解动态规划的基本概念动态规划是一种分阶段决策的过程,它将一个问题分解为若干个子问题,并通过解决子问题来求解原问题。
动态规划的核心思想是保存子问题的解,避免重复计算。
2.掌握动态规划的解题步骤(1)明确状态:将问题分解为若干个子问题,并定义状态变量,这些状态变量可以用来描述子问题的解。
(2)建立状态转移方程:根据子问题之间的关系,找出状态之间的转移规律,建立状态转移方程。
(3)确定边界条件:为了解决边界问题,需要为状态转移方程设定合适的边界条件。
(4)计算最优解:根据状态转移方程和边界条件,计算出问题的最优解。
3.学习动态规划的常用技巧(1)画出状态转移图:通过画出状态转移图,可以更清晰地理解状态之间的转移关系。
(2)使用表格法:将状态和状态转移方程写成表格形式,便于分析和计算。
(3)利用代码实现:通过编写代码,将动态规划的思想转化为程序,验证自己的思路。
三、动态规划实践案例1.最长公共子序列最长公共子序列(LongestCommonSubsequence,LCS)问题是动态规划的经典问题之一。
给定两个序列X和Y,求它们的最长公共子序列。
案例分析:我们可以用一个二维数组dp来表示X和Y的最长公共子序列。
dp[i][j]表示X的前i个字符与Y的前j个字符的最长公共子序列的长度。
状态转移方程为:dp[i][j]={dp[i-1][j-1]+1,ifX[i]==Y[j]max(dp[i-1][j],dp[i][j-1]),otherwise}代码实现:defLCS(X,Y):m,n=len(X),len(Y)dp=[[0](n+1)for_inrange(m+1)]foriinrange(1,m+1):forjinrange(1,n+1):ifX[i-1]==Y[j-1]:dp[i][j]=dp[i-1][j-1]+1else:dp[i][j]=max(dp[i-1][j],dp[i][j-1])returndp[m][n]2.0-1背包问题0-1背包问题是动态规划的另一个经典问题。
动态规划的基本思想

动态规划的基本思想动态规划是一种常见的解决问题的算法思想,它通过将复杂的问题分解成一个个子问题,逐步求解并记录下每个子问题的解,最终得到原问题的解。
这种思想在很多领域都有广泛的应用,例如计算机科学、经济学、物理学等。
一、动态规划的定义与特点动态规划是一种分治法的改进方法,它主要用于解决具有重叠子问题和最优子结构性质的问题。
它的基本思想可以概括为“记住中间结果,以便在需要的时候直接使用”。
动态规划算法的特点包括:1. 问题可以分解为若干个重叠的子问题;2. 子问题的解可以通过已知的子问题解来求解,且子问题的解可以重复使用;3. 需要使用一个数据结构(通常是一个矩阵)来存储子问题的解,以便在需要时直接取出。
二、动态规划的基本步骤动态规划算法通常可以分为以下几个基本步骤:1. 确定问题的状态:将原问题转化为一个或多个子问题,并定义清楚每个子问题的状态是什么。
2. 定义问题的状态转移方程:找出子问题之间的关系,即如何通过已知的子问题解来解决当前问题。
3. 设置边界条件:确定最简单的子问题的解,即边界条件。
4. 计算子问题的解并记录:按顺序计算子问题的解,并将每个子问题的解记录下来,以便在需要时直接使用。
5. 由子问题的解得到原问题的解:根据子问题的解和状态转移方程,计算得到原问题的解。
三、动态规划的实例分析为了更好地理解动态规划的基本思想,我们以求解斐波那契数列为例进行分析。
问题描述:斐波那契数列是一个经典的数学问题,它由以下递推关系定义:F(n) = F(n-1) + F(n-2),其中F(0) = 0,F(1) = 1。
解决思路:根据递推关系,可以将问题分解为求解F(n-1)和F(n-2)两个子问题,并将子问题的解累加得到原问题的解。
根据以上思路,可以得到以下的动态规划算法实现:1. 确定问题的状态:将第n个斐波那契数定义为一个状态,记为F(n)。
2. 定义问题的状态转移方程:由递推关系F(n) = F(n-1) + F(n-2)可得,F(n)的值等于前两个斐波那契数之和。
生成树和拓扑排序_黄哲威

假设前 k−1 步 P 选择的边都在 T 中,令此时的树为 P′
第k步选择的e=(u,v)不不在T中,假设u在P′ 中,而而v不不在
T 中必有一一条 u → v 的路路径,路路径上必有一一条边 e′ = (x,y) 满足足此 时 x 在 P′ 中而而y不不在
若 w(e′) > w(e) 则在 T 中用用 e 换掉 e′ 可得到一一个更更小小的生生成树, 矛矛盾 若 w(e′) < w(e) 则第 k 步时选的是 e′ 而而不不是 e,矛矛盾 若 w(e′) = w(e),在 T 中用用 e 换掉 e′, 则 P 前 k 步中选择边都在 T 中 有限步后可把 T 变为 P 且权值不不变,因此 P 就是最小小生生成树
拓拓扑排序
现在来考虑一一个问题:现在有一一个工工程,这个工工程被分成了了很 多部分。有一一些部分要求前面面某些部分完成后才可以开始进 行行行。有些部分则可以同时进行行行。
我们可以把每个部分看作一一个结点,这些限制看成是有向边。
比比如说这张图就可以看成是这样一一个限制。这样的图没有环!
因此这样的图也被成为有向无无环图 (DAG)。
• 1 <= n <= 5 * 10^5,部分数据只有 Add,部分数据没有 Return 操作。
• 每次操作以后,求全图的最小小生生成树边权和,若不不存在输出 0。
UOJ14. DZY Loves Graph
• 只有加边的情况,那么当图连通后第一一次有了了最小小生生成树。
• 因为加的边权是单调递增的,最小小生生成树保持不不变直到最后。
生生成树和拓拓扑排序
2020年年1月月20日日
⻩黄哲威 hzwer
北北京大大学16级计算机科学
课程安排 2
动态规划法

动态规划法动态规划法(Dynamic Programming)是一种常用的算法思想,主要用于解决具有重叠子问题性质和最优子结构性质的问题。
动态规划法通过把问题分解为更小的子问题,并将子问题的解存储起来,以避免重复计算,从而提高了算法的效率。
动态规划法有两个核心概念:状态和状态转移方程。
在动态规划过程中,我们需要定义状态,即问题的子问题解,以及状态之间的关系,即状态转移方程。
动态规划法的一般步骤如下:1. 定义问题的子问题:将问题划分为更小的子问题,并明确子问题的解是什么。
2. 定义状态:将问题的子问题解抽象为状态,即用一个变量或者数组表示子问题的解。
3. 定义状态转移方程:根据子问题的关系,定义状态之间的转移方程,即如何根据已知的子问题解计算出更大的问题的解。
4. 缓存子问题解:为了避免重复计算,我们需要将已经计算过的子问题解存储起来,以便后续使用。
5. 递推计算:通过状态转移方程和缓存的子问题解,逐步计算出更大的问题的解,直到计算出最终的问题解。
动态规划法的关键在于找到正确的状态转移方程和合理的存储子问题解的方式。
有些问题的状态转移方程比较容易找到,比如斐波那契数列,每个数都是前两个数的和;而有些问题的状态转移方程可能比较复杂,需要通过观察问题的特点和具体分析来确定。
动态规划法的时间复杂度通常为O(n),其中n 表示问题规模。
由于利用了子问题的解,避免了重复计算,因此动态规划法相对于暴力求解法能够大大提高算法的效率。
但是,动态规划法的空间复杂度通常较高,需要存储大量的子问题解,因此在实际应用中需要权衡时间和空间的消耗。
总的来说,动态规划法是一种非常灵活且强大的算法思想,能够解决许多复杂的问题,特别适用于具有重叠子问题性质和最优子结构性质的问题。
通过正确定义状态和状态转移方程,并结合缓存子问题解和递推计算,我们可以高效地求解这类问题,提高算法的效率。
动态规划算法教学PPT

03
动态规划算法的实现步骤
明确问题,建立数学模型
1
确定问题的目标和约束条件,将其转化为数学模 型。
2
理解问题的阶段划分,将问题分解为若干个子问 题。
3
确定状态变量和决策变量,以便描述子问题的状 态和决策。
划分阶段,确定状态变量和决策变量
01
根据问题的阶段划分,将问题分解为若干个子问题。
02
确定状态变量和决策变量,以便描述子问题的状态 和决策。
02
将子问题的最优解组合起来,得到原问题的最优解。
对最优解进行验证和性能评估,确保其满足问题的要求。
03
04
动态规划算法的优化技巧
分支定界法
分支定界法是一种求解优化问题的算 法,它通过不断生成问题的分支并确 定每个分支的界限,来寻找最优解。 在动态规划中,分支定界法可以用来 优化状态转移方程,减少计算量。
详细描述
多目标规划问题在实际生活中应用广泛,如资源分配、项目计划、城市规划等领 域都有涉及。常用的求解多目标规划的方法包括权重和法、帕累托最优解等。
多阶段决策问题
总结词
多阶段决策问题是动态规划中的一类,解决的问题需要在多个阶段做出决策,每个阶段的决策都会影响到后续阶 段的决策。
详细描述
多阶段决策问题在实际生活中应用广泛,如生产计划、库存管理、路径规划等领域都有涉及。常用的求解多阶段 决策问题的方法包括递归法、动态规划等。
特点
动态规划算法具有最优子结构、重叠 子问题和最优解性质等特征。
动态规划算法的应用领域
计算机科学
在计算机科学中,动态规划算法广泛应用于字符 串处理、排序、数据压缩和机器学习等领域。
电子工程
在电子工程中,动态规划算法用于信号处理、通 信和控制系统等领域。
树形动态规划

树形动态规划动态规划: 问题可以分解成若⼲相互联系的阶段,在每⼀个阶段都要做出决策,全部过程的决策是⼀个决策序列。
要使整个活动的总体效果达到最优的问题,称为多阶段决策问题。
动态规划就是解决多阶段决策最优化问题的⼀种思想⽅法。
阶段: 将所给问题的过程,按时间或空间(树归中是空间,即层数)特征分解成若⼲相互联系的阶段,以便按次序去求每阶段的解。
状态: 各阶段开始时的客观条件叫做状态。
决策: 当各段的状态取定以后,就可以做出不同的决定,从⽽确定下⼀阶段的状态,这种决定称为决策。
(即孩⼦节点和⽗亲节点的关系)策略: 由开始到终点的全过程中,由每段决策组成的决策序列称为全过程策略,简称策略。
状态转移⽅程: 前⼀阶段的终点就是后⼀阶段的起点,前⼀阶段的决策选择导出了后⼀阶段的状态,这种关系描述了由k阶段到k+1阶段(在树中是孩⼦节点和⽗亲节点)状态的演变规律,称为状态转移⽅程。
⽬标函数与最优化概念: ⽬标函数是衡量多阶段决策过程优劣的准则。
最优化概念是在⼀定条件下找到⼀个途径,经过按题⽬具体性质所确定的运算以后,使全过程的总效益达到最优。
树的特点与性质:1、有n个点,n-1条边的⽆向图,任意两顶点间可达2、⽆向图中任意两个点间有且只有⼀条路3、⼀个点⾄多有⼀个前趋,但可以有多个后继4、⽆向图中没有环;拿到⼀道树规题,我们有以下3个步骤需要执⾏:1. 判断是否是⼀道树规题:即判断数据结构是否是⼀棵树,然后是否符合动态规划的要求。
如果是,那么执⾏以下步骤,如果不是,那么换台。
2. 建树:通过数据量和题⽬要求,选择合适的树的存储⽅式。
如果节点数⼩于5000,那么我们可以⽤邻接矩阵存储,如果更⼤可以⽤邻接表来存储(注意边要开到2*n,因为是双向的。
这是⾎与泪的教训)。
如果是⼆叉树或者是需要多叉转⼆叉,那么我们可以⽤两个⼀维数组brother[],child[]来存储(这⼀点下⾯会仔细数的)。
3. 写出树规⽅程:通过观察孩⼦和⽗亲之间的关系建⽴⽅程。
《动态规划》课件

xx年xx月xx日
• 动态规划概述 • 动态规划的基本概念 • 动态规划的求解方法 • 动态规划的应用实例 • 动态规划的优化技巧 • 动态规划的总结与展望
目录
01
动态规划概述
定义与特点
定义
动态规划是一种通过将原问题分解为 相互重叠的子问题,并存储子问题的 解以避免重复计算的方法。
特点
动态规划适用于具有重叠子问题和最 优子结构的问题,通过将问题分解为 子问题,可以找到最优解。
动态规划的适用范围
最优化问题
01
动态规划适用于解决最优化问题,如最大/最小化问题、决策问
题等。
子问题重叠
02
动态规划适用于子问题重叠的情况,即子问题之间存在共享状
态或参数。
递归关系
03
动态规划适用于具有递归关系的问题,可以通过递归方式求解
机器调度问题
总结词
动态规划可以应用于机器调度问题,以确定最优的调度方案,满足生产需求并降低成本 。
详细描述
机器调度问题是一个经典的优化问题,涉及到如何分配任务到机器上,以最小化成本或 最大化效率。通过动态规划,可以将机器调度问题分解为一系列子问题,如确定每个任 务的调度顺序、分配机器等,并逐个求解子问题的最优解,最终得到整个调度方案的最
VS
详细描述
记忆化搜索法是一种优化技术,通过存储 已解决的子问题的解,避免重复计算,提 高求解效率。这种方法适用于子问题数量 较少且相互独立的情况。
04
动态规划的应用实例
最短路径问题
总结词
通过动态规划解决最短路径问题,可以找到 从起点到终点的最短路径。
详细描述
在图论中,最短路径问题是一个经典的优化 问题,旨在找到从起点到终点之间的一条路 径,使得路径上的所有边的权重之和最小。 动态规划是一种有效的解决方法,通过将问 题分解为子问题并存储子问题的解,避免了 重复计算,提高了求解效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
花神的数论题
» 用用sum(i)表示数i二二进制表示下1的个数。 » 问sum(1)~sum(n)这n个数的乘积对
1000000007取模的结果。 » n<=10^15
» 这使得NOIp中看似没有单独讨论数位DP的必 要。
» 但事实上这种方方法还是有或多或少的细节,所以 大大家还是把数位DP看成一一类特殊的DP。初学者 一一般比比较难以一一次写对,但好好对拍就没事了了。
WINDY数
» windy定义了了一一种windy数。不不含前导零且相 邻两个数字之差至至少为2的正整数被称为 windy数。 windy想知道,在A和B之间,包括 A和B,总共有多少个windy数?将答案对 1000000007取模。
树形与数位动态规划
2019年年1月月26日日
⻩黄哲威 hzwer
北北京大大学16级计算机科学
第三节目目标
• 一一些树形dp补充
• 数位dp介绍
• 数位dp练习
NOIP2014 联合权值
» 无无向连通图 G 有 n 个点,n-1 条边。点从 1 到 n 依次编 号,编号为 i 的点的权值为 Wi,每条边的⻓长度均为 1。
» 但是这题数据范围有10^9,(sqrt(B)),这里里里取60000左右。然后预处理理出所有 F[k*S], k=1,2,...
» 这样读入入询问后,找到离B最近的一一个k*S,从F[k*S]开始暴暴力力力计算F[B]。 例例如B=60111,那么因为已经算出了了F[60000],暴暴力力力for i=60001 ... 60111 判断每个i是否是windy数即可。
• 在n个点的点权树上选两条不不相交的路路径,使
路路径上的点权和最大大
• n <= 100000
BZOJ1369.Gem
• 给出一一棵树,要求你为树上的结点标上权值,权值可以是任意
的正整数,唯一一的限制条件是相邻的两个结点不不能标上相同的 权值,要求一一种方方案,使得整棵树的总价值最小小。
• N <= 10000
最终一一定存在点,使得最优解的一一条链 a 经过它,另一一条链 b 在它的 一一个儿儿子子的子子树内且链 a 不不经过这个儿儿子子
枚举这个儿儿子子y,答案就是best[y]加上链 a
链 a 有若干干种情况,记录down的前后缀最大大/次大大值讨论一一下即可
BZOJ1040. 骑士士
• 有N个骑士士,每个人人有一一个战斗斗力力力,每个人人有一一个他讨厌的骑
BZOJ1040. 骑士士
• 有N个骑士士,每个人人有一一个战斗斗力力力,每个人人有一一个他讨厌的骑
士士,求一一个骑士士军团,使得军团战斗斗力力力的和最大大且不不包含有矛矛 盾的两人人。
• 1 <= N <= 10^6
• 整个图实际上是一一个无无向环套树森林林。
• 对于每一一棵环套树,先dfs找环,找到环以后断环为链并将断
» A,B<=2*10^9
WINDY数
» 按照上题的方方法转化为没有限制的形式,于是只需 要统计⻓长度为n的序列列,有多少个满足足相邻两个数 差至至少为2(这个序列列的第一一个元素确定)。
» 这用用形如dp[i][c]的dp来记确定了了前i位,最后一一位的 数值是c,总共的方方案数。来进行行行处理理非非常简单。
» 现给定一一个数n,问S生生成的数中有多少个<=n。 答案对10^9+7取模。
» n<=10^50
计数
» 设n是m位的。往S中补0直到|S|=m。 » 问题就转化为将S中的数重新排列列,有多少小小
于等于n。 » 枚举公共前缀搞一一发之后直接变成,给定一一个
可重集S’,问S’中的元素组成的不不同的排列列个 数。 » 设数i有ai个,那么答案就是(sum ai)!/(prod ai!)
1][0/1]的时候记一一下确定了了前i位,当前有没有分出大大小小,前缀是否 都是零之类的限制。然后枚举下一一位是什什么进行行行转移。 » 如果考虑不不清楚这个状态的设计转移以及各种边界情况,可以换一一 个方方法:注意到任何一一个<=b的数x,一一定和b有一一个k位公共前缀。 这k位他们相同,第k+1位x<b。 » 枚举公共前缀的⻓长度k,枚举第k+1位上x的值,之后转化为没有任何 限制的情况。 » 对于k=0,变为枚举最高高位的位置及数值,同样转化为没有限制的情 况。
开的两个点强制其中一一个点为根且不不选做一一次树形DP,对另一一 个点做同样操作。
BZOJ2427. 软件安装
• 现在我们的手手头有N个软件,对于一一个软件i,它要占用用Wi的磁
盘空间,它的价值为Vi。我们希望从中选择一一些软件安装到一一 台磁盘容量量为M计算机上,使得这些软件的价值尽可能大大(即 Vi的和最大大)。
枚举这个儿儿子子y,答案就是best[y]加上链 a
链 a 有若干干种情况,记录down的前后缀最大大/次大大值讨论一一下即可
Codefest 16.The Chocolate Spree
best[x]表示x子子树内的最⻓长链
down[x]表示子子树内从x出发的最⻓长链
up[x]表示从x出发,终点在x子子树外的最⻓长链
士士,求一一个骑士士军团,使得军团战斗斗力力力的和最大大且不不包含有矛矛 盾的两人人。
• 1 <= N <= 10^6
• 整个图实际上是一一个无无向环套树森林林。
• 对于每一一棵环套树,先dfs找环,找到环以后断环为链并将断
开的两个点强制其中一一个点为根且不不选做一一次树形DP,对另一一 个点做同样操作。
f(i,j)表示对i及其子子树花费j代价产生生的最大大价值
BZOJ2427. 软件安装
显然图是一一些环和树
若有环必须选整个环,或者直接舍弃
将环缩点完之后变成一一堆点和森林林,建立立虚点向所有无无入入度的点 连边
缩点用用闭包传递或者tarjan,剩下的就是个树形dp问题
f(i,j)表示对i及其子子树花费j代价产生生的最大大价值
有部分数据M=0,部分数据M=1
小小奇的仓库
对于M=1的情况,树形DP到一一个点时记录有多少个0,多少个 1,然后每当一一条路路径到2,那部分就再记录一一个值。
小小奇的仓库
对于M=1的情况,树形DP到一一个点时记录有多少个0,多少个 1,然后每当一一条路路径到2,那部分就再记录一一个值。
M<=15,只要把“0”、“1”、大大于等于2变成0~16
• 每个软件可能依赖零个或者一一个软件
• 0<=N<=100, 0<=M<=500
BZOJ2427. 软件安装
显然图是一一些环和树
若有环必须选整个环,或者直接舍弃
将环缩点完之后变成一一堆点和森林林,建立立虚点向所有无无入入度的点 连边
缩点用用闭包传递或者tarjan,剩下的就是个树形dp问题
数位DP
» 数位DP就是处理理和具体的数有关的DP。 » 大大多数的题目目形式类似于:统计[L,R]之间有多少整数满足足xx
性质。这个xx性质往往是数位之间的性质。L、R一一般很大大, 如10^100000,算法复杂度往往和数的位数相关。 » 不不过NOIp范围内,数据范围可能并不不会真的给到 10^100000。出题人人通常只想确保你写的不不是完全的暴暴力力力, 因此可能数据范围只给到10^9。这就给其他一一些骗分算法诸 如分段打表留留下了了发挥的空间。 » 数位DP主要麻烦的地方方在于前导零的处理理、<=R之类限制的 处理理。撇开这些通常就是一一个普通的序列列DP。
数字计数
» 给定两个正整数a和b,求在[a,b]中的所有整 数中,每个数字(digit, i.e. 0~9)各出现了了多少 次。
» a,b<=10^12
数字计数
» 常用用转化:统计[0,a-1]和[0,b]的答案,相减就是[a,b]的答案。 » 许多写过数位dp的同学,对于<=b这个限制的处理理往往都是dp[i][0/
» 图上两点 (u, v) 的距离定义为 u 点到 v 点的最短距离。 » 对于图 G 上的点对 (u, v),若它们的距离为 2,则它们
之间会产生生 Wu×Wv 的联合权值。 » 请问图 G 上所有可产生生联合权值的有序点对中,联合权
值最大大的是多少? 所有联合权值之和是多少? » 其中 0 ≤ n ≤ 10^5
» 这样至至多只需要暴暴力力力O(S)步,算法的复杂度是O(sqrt B)的。
计数
» 给你一一堆非非零的数字可重集S(一一个数字可能出 现多次)。你可以随意排列列,然后在里里里面面插入入 任意多个0,这样就能得到无无穷多个数。
» 比比如说给定{1,2},那么可以生生成数字 12,21,102,120,201,210,1002,1020,等等。
数位DP
» 数位DP就是处理理和具体的数有关的DP。 » 大大多数的题目目形式类似于:统计[L,R]之间有多少整数满足足xx
性质。这个xx性质往往是数位之间的性质。L、R一一般很大大, 如10^100000,算法复杂度往往和数的位数相关。 » 不不过NOIp范围内,数据范围可能并不不会真的给到 10^100000。出题人人通常只想确保你写的不不是完全的暴暴力力力, 因此可能数据范围只给到10^9。这就给其他一一些骗分算法诸 如分段打表留留下了了发挥的空间。 » 数位DP主要麻烦的地方方在于前导零的处理理、<=R之类限制的 处理理。撇开这些通常就是一一个普通的序列列DP。
NOIP2014 联合权值
树形 dp : 一一个结点距离相差 2 的点要不不然是儿儿 子子的儿儿子子,不不然是兄弟 考虑第二二部分 如果枚举一一个结点的儿儿子子两两计算的话,会被 箭形图卡成 n^2 只要再用用前缀和/最大大值维护一一 下即可
Codefest 16.The Chocolate Spree