动态规划—基础介绍

本文介绍了动态规划的基础概念,包括最优子结构、无后效性和子问题重叠。通过 fibonacci 数列举例说明动态规划的特性,并指出适用于求最值、求和及存在性判定等问题。解题步骤涉及确定状态、状态转移方程和定义边界。文章还讨论了 leetcode 中动态规划的两个实例:零钱兑换和不同路径Ⅱ,解析了状态定义、状态转移方程和边界条件。最后提到了动态规划在解决障碍物网格路径问题中的应用。
摘要由CSDN通过智能技术生成

概述

说起动态规划就不得不提起 Fibonacci数列 了,这个数列从第3项开始,每一项都等于前两项之和。而根据前一状态求得当前状态是动态规划一个很典型的特点,我们能够利用递推轻松的写出代码。

#include<iostream>
#include<cstring>
using namespace std;
 
int main()
{
   
    int n;
	cin>>n;
    int dp[n + 1];
    memset(dp, 0, sizeof(dp));
    dp[1] = dp[2] = 1;
    for(int i = 3; i <= n; i++){
   
    	dp[i] = dp[i - 1] + dp[i - 2];
    }
    cout<<dp[n]; //输出最终结果  
}

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。

通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

适用情况

首先我们需要知道动态规划算法的三个性质,我们一个一个来解释一下:

  1. 最优子结构 :如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质。
  2. 无后效性:即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
  3. 子问题重叠:算法计算的过程中会反复地求解相同的一定量的子问题,而不是不断生成没有见过的新问题。以Fibonacci数列来说,当你想要求得数列中第n位的值,如果按照自顶向下的递归方法来编写代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值