(初学者的恶魔)——动态规划介绍+洛谷过河卒(c代码)

前言+引入

大家对动态规划的说法不一,有的人觉得这是递归思想,有人认为这是空间换时间,也可以是一种寻找最优解的方法等等……但是总的来说,动态规划可以理解为一个有向无环图,有起始结点,终止结点,每一个结点对应一个状态,每一个非起始结点都可以从其他结点推出。所以动态规划的关键就是找出这样的图,这样问题就迎刃而解了——英雄哥。

主题——动态规划

最基本的一个例子就是我们所熟知的斐波那契数列,我们都知道在这个数列中,后一个数等于前两个数之和,设斐波那契数列为F[n],F[n] = F[n-1] + F[n-1],转化为图即为:

这时候我们开始思考一个简单的问题,小青蛙跳台阶,题如图所示:

可能大家第一眼看见不知道怎么下手(绞尽脑汁……),其实,这就是典型的斐波那契数列,怎样跳上第十阶?只有从第九阶和第八阶跳上来,所以跳上第十阶就是前两阶的方法之和。以此类推,我们把它想成一个数组,其含有以下关系,F[10] = F[9] + F[8],F[1] = 1, F[2] = 2(自己可推出来),然后问题不就解决了吗,不管多少阶都能用计算机强大的算力算出。

接着我们引入一个复杂一点的问题——过河卒问题,题目如下图:

 过河卒问题刚好与我们上述描述的原理很像,所以这里我们可以拿它来做我们的例子,但是这个例子不能单纯的套用上述的公式,因为马所在的位置会导致卒有一部分地方不能走,但是我们的模型还是没有变,让我们开始分析这道题。我们要想到达B点,只能从他的左方或者上方到达吧,则这个模型很明显构建出来,即F[i][j] = F[i-1][j] + F[i][j-1],这样子我们的方程就已经列出来了,只需要找到它的初值即可,因为在x,y轴边界上,只有一个方法可以走,所以边界上的点都令为1,同理,原点也是。但是我们需要将x,y轴向左上方平移两个单位,这样是为了防止马在边界时,其到达的位置会越界。然后用另一个数组来标记马会到达的地方,在使用上述关系时,排除掉这些地方那答案不就出来了吗。

代码讲解

a[][]相当于是我们的棋盘,b[][]是我们用来记录马会到达的地方。

每个点+2相当于x,y轴都平移了两个单位,防止马在边界时会越界。

循环时是为了更新a[][]中每个点能到达的方法(因为i,j不能同时为2(就是不为原点),所以边界也一起赋值了,不用单独写代码去赋边界的值了,马能到达的地方就是初始值0)。

代码如下:

 这样理解过后是不是感觉写dp问题自己脑子里会有一个大概的思路了,但是dp问题种类是多种多样的,还是需要自己不断磨练才能找到属于自己的方法,这里为大家提供一点思路,希望能帮到大家(解脱✌️)。

结束!!!

  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值