c语言dp算法,通过leetcode学算法——动态规划(dp)

先贴问题:

Delete Operation for Two Strings

Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string.

说白了就是找到两个字符串非连续最大公共字符串。如果对dp算法很熟悉的很快就能想到这个问题的解法,然而我并不是很熟悉,所以用了一个很挫很慢的方法,个人理解应该是分治法,很多步骤被重复算了很多次。

494339f6054637698a46305000985f18.png

写的很搓,轻喷。

下面就要介绍一下简单易懂的dp算法啦,先上代码(leetcode里大神写的,我只是用golang重写一遍)

44c1390869c3edb463f7c9c8120a9cec.png

思路很简单,比如 word1=abcd,word2=obdce。

用一个二维数组保存计算的值(代码里多加了一行和一列置0方便计算)

4bcd686f76b06fb39a3b53c9566010cc.png

比如比较word1的c和word2的c的时候,因为ab和obd的最大相同是1,所以这个位置上只需要dp[i-1][j-1]+1

动态规划和分治区别:

动态规划:它通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。

分治法:若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。

注:不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。

这一题算是让我对动态规划有一个更深的印象,故记录一下。以前虽然会写,但是每次遇到问题都不会想不到去用,还是自己疏于练习。

纸上得来终觉浅,绝知此事要躬行呀。

有疑问加站长微信联系(非本文作者)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值