这题是个好题目,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码