动态规划
文章平均质量分 89
是哆啦D梦
ACMer
展开
-
动态规划之单调队列/单调栈优化
前言单调队列优化dp是最常用的优化dp方程的方式之一通常是通过将 可转移状态 存入一个单调队列中,不断维护它,来进行状态转移。并且这个 可转移状态 是 连续且单调的 。原理: 如果一个选手比你小,还比你强,你就可以退役了往往可以通过朴素的dp找到一种方法,再根据单调队列优化。例如:O(n2) - O(kn)【注意】这里的队列是指队尾只能出,队首即可以出又可以入的队列。如果队尾不需要出只需要入,那么也可以写出单调栈的形式。例题汇总单调栈例题1题目描述: 给定 n 个数 ai,1<原创 2021-08-20 12:31:12 · 506 阅读 · 0 评论 -
期望与期望dp/概率dp
关于期望期望的两个公式:通用公式: ∑pi×vi\sum p_i\times v_i∑pi×vi,pi 为概率,vi 为得分等概率: ∑vi/cnt\sum v_i/cnt∑vi/cnt,vi 为得分,cnt 为总选择。简单求期望例题1:期望独立单独计算题目描述: 有 n 道题,每道题有 ai 个答案。对于第 i 道题,小明随意的蒙了一个 [1,ai][1,a_i][1,ai] 的答案,即每道题都有 1/ai1/a_i1/ai 的概率对。可是小明抄错了,不小心把第 i 道题的答案原创 2021-09-16 16:17:04 · 544 阅读 · 0 评论 -
动态规划之悬线法
前言悬线法是一种很好的,可以解决下面这类题型从矩阵中找到一个满足某条件的最大矩阵算法思路悬线如下:状态表示: 定义 h[i][j]h[i][j]h[i][j] 为从 (i,j)(i,j)(i,j) 往下的一条悬线最长长度,定义 l[i][j],r[i][j]l[i][j],r[i][j]l[i][j],r[i][j] 为从 (i,j)(i,j)(i,j) 往下的一条悬线能往左/右延申到的左右边界。状态转移: 不同的题有不同的转移方式。例题1:最大只包含1的矩形例题链接题目描述: 一个原创 2021-08-22 02:04:48 · 169 阅读 · 0 评论 -
矩阵快速幂优化dp
前言线性代数中的矩阵乘法对写编程有帮助,比如矩阵快速幂求斐波那契数列第n项之类的,所以我们要去稍微学习一些相关的运算矩阵乘法的计算运算规则:Cij = sum(Aik * Bkj)对于两个矩阵Aij和Bnm当且仅当j==n时,AB有意义,且结果矩阵为Cim根据运算规则可以写成其代码#include<bits/stdc++.h>using namespace std;int A[10][10],B[10][10],C[10][10];int main(){ int a原创 2020-11-14 11:06:33 · 732 阅读 · 0 评论 -
各种类型的线段覆盖问题
问题1问题描述:1 - L的一维区间上,有n条线段,线段两端点分别为li,ri。求覆盖全部的最小线段条数。问题分析:贪心。贪心策略:按 l 小 r 大的排序方式排序,得到第一条从 l1_11=1 出发且 r1_11最大的线段,则第二条线段的 l2_22 需要 <= r1_11,且r2_22尽可能大。同理第三条线段的 l3_33<=r2_22且r3_33尽可能大。以此类推,很容易感觉到,该贪心策略已是最优策略。问题2问题描述:1 - L的一维区间上,有n条线段,线段两原创 2021-04-04 10:14:01 · 1269 阅读 · 0 评论 -
数位dp(从小白到大白)
还没写完,等等我物理作业补一下经典问题模型给定一个闭区间 [L,R],求区间中满足某条件的数的个数例题题目大意:给定一个区间 ,求其中,将数位拆分后,相邻两个数字相差至少为2的数的个数。除了最后部分的记忆化搜索和代码实现举了个该例题的例子,其他分析部分均没有用到该例子,均为统一模板思维问题分析首先,利用差分的思想,我们把求区间 [L,R] 中满足条件的数的个数看成求区间 [1,R] 中满足条件的数的个数减去区间 [1,L-1] 中满足某条件的个数,即 ansr_rr - ansl−原创 2021-03-23 20:27:58 · 508 阅读 · 0 评论 -
树上动态规划的归纳总结
个人理解树上动态规划类比线性动态规划 线性动态规划:该状态由前面一个状态转移而来 树上动态规划:父结点状态由所有子节点状态转移而来其实学会了线性动态规划,树上动态规划自然会的差不多了归纳模式一相邻取与不取问题:树上的相邻结点不能同时取,求取得的最大值设f[u][1],f[u][0]分别表示u取与不取的时候能取得的最大值易知:f[u][1]=sum(f[v][0])+a[u] f[u][0]=sum(max(f[v][1],f[v][0]))例题#include<iostrea原创 2021-02-25 18:07:44 · 358 阅读 · 0 评论 -
区间动态规划的归纳总结
一.个人理解区间动态规划就是先计算出小区间的权值,大区间由两个已计算好的小区间合并而成,枚举大区间被两个小区间拆分的断点即可求出大区间的最优值。其很明显的至少由两层循环组成,且大部分都是三层循环基本模式如下:for(int i=1;i<=n;i++)f[i][i]=1;for(int len=1;len<=n;len++){ for(int l=1;l<=n;l++){ int r=l+len; if(r>n)break; for(int k=l;k<r原创 2021-02-25 13:52:33 · 377 阅读 · 0 评论 -
动态规划之状态压缩(从入门到入土)
一.基本思想动态规划中最难的一类题之一,随随便便拿出一题都是提高+省选-其主要思想是二进制位运算。举个例子:一条街上有n个路灯,路灯只有亮与不亮两种状态。如果去描述这n个路灯的状态呢???用数组描述显然可以,但有没有其他的方法???二进制下的一个整数 k !!!例如:n等于8,k=183,k=10110111(2)那么整数 k 就可以表示第123568个路灯亮,其余路灯不亮其他功能怎么办???比如判第i个灯是否亮,关闭第i个灯,如何关闭多个灯之类的位运算来啦!!!这个表格原创 2020-12-11 19:55:28 · 197 阅读 · 0 评论 -
线性动态规划的归纳总结
归纳模式一从n个东西从选取m个东西,求其所得到的相应的sum的最小值,(sum与选取的m个东西的相邻方式有关)想到的第一个思路:令f[i][j]为有前i种物品情况下,选取j个物品的sum。但是我们发现一个很大的弊端,因为sum与第i个物品的上一个物品有关,而我们无法知道上一个物品究竟是哪个,这就很难推出状态转移方程想到的第二个思路(正确思路)令f[i][j]为以第i个物品结尾时,选取j的物品的sum。易知:f[i][j]由f[k][j-1]得来,且很容易得出第i,k物品的关系则状态转原创 2020-11-11 14:31:47 · 585 阅读 · 0 评论 -
动态规划之背包与硬币
一.01背包有n件物品,每种物品都有体积w[i]和价值v[i],每种物品只有一个,背包体积为V,求该背包一共可以装多少价值的物品?设f[i][j]为有前 i 种物品下,j 体积可以容纳的最大价值则f[i][j]取决于第 i 件物品选与不选若不选:f[i][j]=f[i-1][j]若选:f[i][j]=f[i-1][j-w[i]]+v[i]则:f[i][j]=max(f[i-1][j],f[i-1][j-w[i]])代码奉上for(int i=1;i<=n;i++){ for原创 2020-10-06 00:16:45 · 524 阅读 · 0 评论