leetcode 712

这题是个好题目,mark一下。首先我的思路是求这两个字符串的最长公共子序列,然后遍历这些子序列,找到值最小的那个。结果想了一下,最长子序列不唯一,这样回溯特别复杂,这题应该不是这样做(今天太忙,明天要把最长子序列的长度及回溯实现一下)。后来看了答案才知道是用动态规划来做。说实话,动态规划现在对于我而言,还是不太能掌握的东西,因为很多时候想不到如何很好地定义dp数组的含义,还需要多加联系。

dp最关键的两个步骤,dp数组含义的定义以及子问题的联系。这里dp[i][j]的含义是s1[i:]与s2[j:]它们的最小代价值。既然用到dp,像递归一样,我们也需要定义特殊情况,特殊情况就是i=len(s1)或者j=len(s2)。这时候dp[i][j]的值就相当于没有到头的字符串的ascii码累加。定义好了特殊情况,那我们从底向上或者从上到底来把dp弄完。这时候就需要关系式。可以发现如果s1[i]=s2[j],那么dp[i][j]=dp[i+1][j+1],因为加的值是相同的,对于结果没有影响。如果它们不同,dp[i][j] = min(dp[i+1][j]+ord(s1[i]),dp[i][j+1]+ord(s2[j])),和求最长公共子序列类似,值肯定就是这样的形式,这题我觉得比较经典,mark,mark.

hint:  ord函数 能够将字符转换成ASCII码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值