![](https://img-blog.csdnimg.cn/0febd687942b4f38832866d262552645.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
动态规划
文章平均质量分 80
简单的动态规划介绍
_bxzzy_
新手
展开
-
矩阵乘法+快速幂加速DP
矩阵乘法+快速幂加速DP引入求斐波那契数列第n项快速幂矩阵乘法+快速幂求斐波那契数列第n项应用斐波那契前n项和佳佳的斐波那契GT考试前段时间线代才学完矩阵,这就可以用上了!不得不说线代还是非常有用的,矩阵乘法在计算机图形学里也很有用,高斯消元求方程组也是很常用,瞬间对线代感兴趣了!引入求斐波那契数列第n项首先,我们回忆一个简单的问题:求斐波那契数列的第n项。这个问题很简单,假设我们用f[i]来表示,那么f[1]=f[2]=1f[i]=f[i-1]+f[i-2](i>=2)这应该也算原创 2022-03-22 20:24:20 · 533 阅读 · 1 评论 -
单调队列优化DP
单调队列优化DP最大子序和修剪草坪旅行问题烽火传递绿色通道理想的正方形在多重背包问题3中,我们用到了单调队列优化DP,实际上,不止这个问题,很多问题我们仔细观察,就能发现它有类似的性质,我们就能用单调队列优化,我们通过几道题的练习来观察观察其中的规律。最大子序和题目链接:最大子序和修剪草坪题目链接:修剪草坪旅行问题题目链接:旅行问题烽火传递题目链接:烽火传递绿色通道题目链接:绿色通道理想的正方形题目链接:理想的正方形...原创 2022-02-07 18:02:58 · 2274 阅读 · 3 评论 -
数位DP练习
数位DP度的数量数字游戏Windy数数字游戏2不要62度的数量题目链接:度的数量分析:其实感觉数位DP这类题还是有点章法的,对于求a~b中满足一个条件的数的个数,我们可以转化为求0/1 ~b中满足的个数和0/1 ~a-1中满足的个数,前者减去后者就是答案,而求0/1 ~n中满足条件的个数时我们可以根据题目的要求进行分类讨论,最常见的就是按位讨论了。我们把n按题目要求的进制数进行每一位的拆分并存储在数组中,我们按找从高位到低位进行讨论,这里我们会用到组合数,提前处理一下就可以了。代码实现:#incl原创 2022-02-06 15:18:09 · 2374 阅读 · 0 评论 -
树形DP练习
树形DP树的最长路径树的中心数字转换二叉苹果树战略游戏皇宫看守树的最长路径树的中心数字转换二叉苹果树战略游戏皇宫看守原创 2022-02-05 22:48:26 · 2166 阅读 · 2 评论 -
区间DP练习
区间DP练习环形石子合并能量项链加分二叉树凸多边形的划分棋盘分割环形石子合并题目链接:环形石子合并分析:和石子合并相比就多了一个条件,我们想,就算是环形的,它也是合并n-1次,最后肯定能等价为从某一点断开后的石子合并,因此我们只需把数组开为原来的两倍,也就是把所有石子的值再接在原数组后,然后对2*n长度的数组进行区间DP,从中找出长度为n的合并总分的最大值和最小值即可。代码实现:#include<iostream>using namespace std;const int N =原创 2022-02-05 14:17:51 · 317 阅读 · 0 评论 -
状态压缩DP练习
状态压缩DP练习小国王玉米田炮兵阵地愤怒的小鸟小国王题目链接:小国王分析:看到这题我们可能会想到N皇后问题,但是这道题用爆搜的话是会TLE的,这里我们考虑状压DP,只要我们能想出来表示如何每个表示每个状态,再考虑到细节,基本就能做出来。详细的看代码注释吧。代码实现:#include<iostream>#include<cstring>#include<algorithm>#include<vector>using namespace std;原创 2022-02-05 11:21:45 · 121 阅读 · 0 评论 -
状态机模型练习
状态机模型练习大盗阿福股票买卖4股票买卖5设计密码大盗阿福题目链接:大盗阿福分析:看到这个题目是比较简单的,我们直接写就能写出来。#include<iostream>using namespace std;const int N=1e5+10;int f[N];int n;int a[N];int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n);原创 2022-02-04 15:45:17 · 278 阅读 · 0 评论 -
背包模型补充与练习
背包模型的补充与练习采药Make Them Equal采药题目链接:采药分析:非常明显的01背包代码实现:#include<iostream>using namespace std;int n,m;const int N=110,M=1010;int w[N],v[N];int dp[M];int main(){ cin>>m>>n; for(int i=1;i<=n;i++){ cin>>w[i]&原创 2022-02-04 11:04:38 · 508 阅读 · 0 评论 -
最长上升子序列模型练习
最长上升子序列模型练习怪盗基德的滑翔翼登山友好城市最大上升子序列和拦截导弹导弹防御系统最长公共上升子序列怪盗基德的滑翔翼题目链接:怪盗基德的滑翔翼分析:这道题还是比较简单的,我们只需要求一遍最长上升子序列(倒着看就是怪盗基德从最后的一个点滑翔到最前面的一个点),再求一遍最长下降子序列,这两者中的最小值就是答案。代码实现:数据范围较小,朴素做法就能过#include<iostream>using namespace std;const int N=110;int a[N],f[N原创 2022-02-02 17:24:35 · 620 阅读 · 2 评论 -
数字三角形模型练习
数字三角形模型练习摘花生最低通行费方格取数传纸条摘花生题目链接:摘花生分析:很简单的一题,基本和数字三角形模型一样,一行一行dp就行了。代码实现:#include<iostream>#include<cstring>using namespace std;const int N=110;int T,g[N][N],n,m,dp[N][N];int main(){ cin>>T; while(T--){ cin>&g原创 2022-02-02 14:18:59 · 280 阅读 · 0 评论 -
动态规划基础
动态规划基础背包模型01背包完全背包多重背包1多重背包2多重背包3分组背包线性DP区间DP状态压缩DP树形DP数位DP记忆化搜索计数类DP动态规划类型的题目种类其实并不多,这里只讲简单的DP,各种DP之间划分界限也没那么明显,所以只是一个大概的划分,重要的是学会思想。我理解的动态规划:绝妙的状态表示+不重不漏的状态转移,我感觉最难的还是如何表示状态,这里简单介绍一些常用的模型,再通过刷题,应该能提高一些自己的水平。背包模型背包类问题大概就是给你一个容量有限的背包、一些有一定价值并会占用一定体积的物品原创 2022-01-28 23:01:21 · 752 阅读 · 0 评论