庖丁解牛斐波拉契数列和背包问题——详细解析两个问题优化过程,带你从最基本的问题看懂动态规划!!!(如果公式不能很好的渲染,请查看这篇同样内容而且能够渲染公式的文章)动态规划作为一种非常经典的一类算法,不仅在解决实际问题当中有很多实际的应用,同时通常也是面试的一个重点。本篇文章一步步剖析动态规划的基本原理,通过斐波拉契数列问题(优化时间复杂度从\(O(2^n)\)到O(n)再到O(log(n)))和经典的01背包问题一步一步带你从最基本的原理弄懂动态规划。我们首先分析斐波拉契数列问题,然后在分析问题的时候慢慢的深入动态规划。本篇文章的篇章结构:斐波拉契数列斐波拉契数列的定义如下:\[F_0=0\
庖丁解牛斐波拉契数列和背包问题——详细解析两个问题优化过程,带你从最基本的问题看懂动态规划!!!(如果公式不能很好的渲染,请查看这篇同样内容而且能够渲染公式的文章)动态规划作为一种非常经典的一类算法,不仅在解决实际问题当中有很多实际的应用,同时通常也是面试的一个重点。本篇文章一步步剖析动态规划的基本原理,通过斐波拉契数列问题(优化时间复杂度从\(O(2^n)\)到O(n)再到O(log(n)))和经典的01背包问题一步一步带你从最基本的原理弄懂动态规划。我们首先分析斐波拉契数列问题,然后在分析问题的时候慢慢的深入动态规划。本篇文章的篇章结构:斐波拉契数列斐波拉契数列的定义如下:\[F_0=0\
区分一维和二维一维和二维的区分,并不是体现在数组的维数上!!!而是体现在概念上:二维指的是下标体现了两个方面:物品的选择关于背包容量一维指下标仅代表:背包的容量一维和二维的代码二维dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,背包价值总和最大是dp[i][j]//weight数组的大小就是物品个数for(inti=1;i一维dp[j]表示背包容量为j所能放的最大价值为dp[j]for(inti=0;i=weight[i];j--){//遍历背包容量dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);}}二维优化到一维关于一维的遍历顺序
区分一维和二维一维和二维的区分,并不是体现在数组的维数上!!!而是体现在概念上:二维指的是下标体现了两个方面:物品的选择关于背包容量一维指下标仅代表:背包的容量一维和二维的代码二维dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,背包价值总和最大是dp[i][j]//weight数组的大小就是物品个数for(inti=1;i一维dp[j]表示背包容量为j所能放的最大价值为dp[j]for(inti=0;i=weight[i];j--){//遍历背包容量dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);}}二维优化到一维关于一维的遍历顺序
P8548小挖的买花(双重限制之限制一个最大一个最小)题目传送门:小挖的买花题解题目分析这道题目是一个多重限制的01背包变种,而且一个限制是限制最大,另一个是限制最小三维状态表示方式:dp[i][j][k],表示前i朵花,费用最大为j,新鲜度最少为k的状态中美丽度最大的状态状态转移:转移方式不选第i枝花直接由dp[i-1][j][k]转移来选第i枝花(判断是否满足限制金额大于等于第i枝花的金额)1.当前的花(第i枝花)直接能满足k需求(即第i枝花的新鲜度大于k)2.第i枝花新鲜度不够k,从之前减去第i枝花金额的j和减去第i枝花新鲜度的k的状态转移过来dp[i][j][k]=dp[i-1][j]
P8548小挖的买花(双重限制之限制一个最大一个最小)题目传送门:小挖的买花题解题目分析这道题目是一个多重限制的01背包变种,而且一个限制是限制最大,另一个是限制最小三维状态表示方式:dp[i][j][k],表示前i朵花,费用最大为j,新鲜度最少为k的状态中美丽度最大的状态状态转移:转移方式不选第i枝花直接由dp[i-1][j][k]转移来选第i枝花(判断是否满足限制金额大于等于第i枝花的金额)1.当前的花(第i枝花)直接能满足k需求(即第i枝花的新鲜度大于k)2.第i枝花新鲜度不够k,从之前减去第i枝花金额的j和减去第i枝花新鲜度的k的状态转移过来dp[i][j][k]=dp[i-1][j]
理解虚基类和虚继承多重继承:代码复用,一个派生类有多个基类。如:classC:publicA,publicB{};虚基类:virtual可以修饰继承方式,是虚继承,被虚继承的类,称作虚基类。classA:virtualpublicB{};虚继承的类中会多一个vbptr指向vbtable,Vbtable中保存的是虚基类中数据在派生类中的内存偏移量,从虚基类中继承的成员变量会被放在派生类内存的最下端。虚函数和虚基类在调用的时候是没有问题的,但是在delete的时候会发生堆报错原因是:基类指针类型的成员p指向派生类对象,永远指向的是派生类基类部分数据的起始地址,这里的基类A的起始位置就是vfptr。
理解虚基类和虚继承多重继承:代码复用,一个派生类有多个基类。如:classC:publicA,publicB{};虚基类:virtual可以修饰继承方式,是虚继承,被虚继承的类,称作虚基类。classA:virtualpublicB{};虚继承的类中会多一个vbptr指向vbtable,Vbtable中保存的是虚基类中数据在派生类中的内存偏移量,从虚基类中继承的成员变量会被放在派生类内存的最下端。虚函数和虚基类在调用的时候是没有问题的,但是在delete的时候会发生堆报错原因是:基类指针类型的成员p指向派生类对象,永远指向的是派生类基类部分数据的起始地址,这里的基类A的起始位置就是vfptr。
在项目中出现多重嵌套情况时,会出现无法滑动的场景,比如经常碰到的场景ViewPager->Fragment->RecyclerView->RecyclerView|ViewPager最外层是一个可滑动的tabLayout+ViewPager,ViewPager中是多个Fragment,Fragment中是RecyclerView,RecycleView列表是一个多类型,内嵌多个横向滑动列表此时内嵌的ViewPager或者RecyclerView,只要是横向滑动,就会跟上层的ViewPager滑动起冲突,导致嵌套的列表无法滑动常规做法就是拦截事件,或者直接在滑动监听中消费事件,但是这种做法只会让
在项目中出现多重嵌套情况时,会出现无法滑动的场景,比如经常碰到的场景ViewPager->Fragment->RecyclerView->RecyclerView|ViewPager最外层是一个可滑动的tabLayout+ViewPager,ViewPager中是多个Fragment,Fragment中是RecyclerView,RecycleView列表是一个多类型,内嵌多个横向滑动列表此时内嵌的ViewPager或者RecyclerView,只要是横向滑动,就会跟上层的ViewPager滑动起冲突,导致嵌套的列表无法滑动常规做法就是拦截事件,或者直接在滑动监听中消费事件,但是这种做法只会让