文章目录
一、Dynamic Programming定义
- 一、Dynamic Programming定义
- 二、斐波那契数列
- 三、跳台阶扩展问题
- 四、最大连续子数组和
- 五、背包问题
- 1.单词拆分 (字符串分割)
- 六、三角矩阵(Triangle)
- 七、路径总数I
- 八、路径总数II
- 九、最小路径和(Minimum Path Sum)
- 十、背包问题
- 十一、回文串分割最小次数问题
- 十二、编辑距离
- 十三、不同的子序列
动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。
在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。
- 动态规划具备了以下三个特点:
- 把原来的问题分解成了几个相似的子问题。
- 所有的子问题都只需要解决一次。
- 储存子问题的解。
动态规划的本质,是对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系)。
- 动态规划问题一般从以下四个角度考虑:
- 状态定义。
- 状态间的转移方程定义。
- 状态的初始化。
- 返回结果。
状态定义的要求:定义的状态一定要形成递推关系。
一句话概括:三特点四要素两本质。
适用场景:最大值/最小值, 可不可行, 是不是,方案个数。
二、斐波那契数列斐波那契数列
class Solution {
public:
int Fibonacci(int n)
{
/*if(n==0||n==1)
{
return n;
}
else
{
return Fibonacci(n-1)+Fibonacci(n-2);
}*/
if(n==0||n==1)
{
return n;
}
int n1=0;
int n2=1;
int n3=0;
while(n>1)
{
n3=(n1+n2)%1000000007;
n1=n2;
n2=n3;
n--;
}
return n3;
}
};
三、跳台阶扩展问题
类似pow的求解
class Solution {
public:
int jumpFloorII(int number)
{
if(number==0||number==1)
{
return number;
}
else
{
int ret=1;
while(number>1)
{
ret=ret*2;
number--;
}
return ret;
}
}
};
四、最大连续子数组和
连续子数组最大和
class Solution {
public:
int FindGreatestSumOfSubArray(vector array)
{
if(array.size()==0)
{
return 0;
}
int sum=array[0];
for(int i=0;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?