目录
动态规划算法
1. 将问题划分为若干子问题
2. 不同于分治法的是各个子问题之间不是相互独立的,一个子问题会依赖于前一个子问题
3. 动态规划算法可以通过画表的方式来实现
1. 动态规划算法常见案例----背包问题
刚刚看了某位博主的文章,对动态规划算法也有了一定的理解!
对于0-1背包问题,我们可以总结为下面的步骤
①确定数组元素的含义
②确定数组之间的关系
③找到初始条件
对于0-1背包问题,我们设数组v[i][j],表示我们所求的价值
然后确定数组元素之间的关系
因为可以装进去也可以不装,所以有两种情况
先是重量判断,可以装进去的前提下会有下面的条件
v[i][j]=max(v[i-1][j],v[i]+v[i-1][j-w[i]] )
所以最后的表达式
2. 动态规划问题之青蛙跳台阶问题
一个🐸一次可以跳一个或者两个台阶,请问🐸跳n个台阶有多少种跳法?
还是按照上面的步骤
①确定表达式的含义
首先,我们定义一个一维数组,dp[],那么dp[i]就表示跳i个台阶有dp[i]种跳法
②确定表达式之间的关系
然后我们可以知道,到了第i个台阶的时候,存在一种关系,就是它可以是跳两个台阶到的,也可以是跳一个台阶到的
所以dp[i]=dp[i-1]+dp[i-2]
③求得初始值
在这里,因为数组从0开始,所以我们可以知道我们需要首先给出dp[0]和dp[1]的值才不会导致到达负数,但是!我们会发现我们给出这两个数据之后,对于dp[2]来说是不对的,因为dp[2]=2,但是用上面的公式求得的解却是1,所以,我们还需要给出dp[2]的值,所以我们就要限定开始为dp[1]和dp[2] !!
最后放代码
public int gugua(int n){
if(n<=1)
return n;
int dp[n];
//给出初始数据
dp[1]=1;
dp[2]=2;
//使用动态规划求解
for(int i=3;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
//返回所得值
return dp[n];
}