力扣打卡总结之动态规划

本文深入探讨了动态规划算法,通过0-1背包问题和青蛙跳台阶问题来阐述其核心思想。动态规划通过划分子问题、建立状态转移方程并填充表格来解决复杂问题。在0-1背包问题中,动态规划数组v[i][j]表示价值,利用状态转移方程v[i][j]=max(v[i-1][j], v[i]+v[i-1][j-w[i]])求解。而在青蛙跳台阶问题中,定义dp[i]表示跳到第i个台阶的方案数,利用dp[i]=dp[i-1]+dp[i-2]建立关系。代码实现中,需要注意初始化dp数组的特殊情况,如dp[1]和dp[2]的设定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

动态规划算法

1. 动态规划算法常见案例----背包问题

2. 动态规划问题之青蛙跳台阶问题


 

动态规划算法

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];

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值