[dp]leetcode712:两个字符串的最小ASCII删除和(medium)

题目:
在这里插入图片描述
题解:

  • 动态规划,转换为求1143. 最大公共字串的ASCII码之和。
  • 状态:dp[i][j]表示t1[1…i]和t2[1…j]的LCS的ASCII码之和(下标从1开始)
  • 状态转移方程:
  • 1)若t1[i]==t2[j],则表示t1和t2的LCS增加一位ASCII了,即dp[i][j]=dp[i-1][j-1]+t1[i-1]。
  • 2)若t1[i]!=t2[j],则表示t1和t2的LCS无法延伸,那么我们将t1[i]和t2[j]分别加入dp[i-1][j-1]中,看谁的LCS长即可。

代码如下:

class Solution {
public:
    //题解:动态规划,转换为求1143. 最大公共字串的ASCII码之和
    int minimumDeleteSum(string s1, string s2) {
        int m=s1.size(),n=s2.size();
        int dp[m+1][n+1];
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=m;++i){
            for(int j=1;j<=n;++j){
                if(s1[i-1]==s2[j-1]){
                    //int+char,会发生类型转换,char会转换为10进制数字
                    dp[i][j]=dp[i-1][j-1]+s1[i-1];
                }
                else{
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        int total=0;
        for(char c:s1)total+=c;
        for(char c:s2)total+=c;
        //最小ASCII删除和=两个字符串的ASCII码之和-最大公共字串的ASCII码之和
        return total-2*dp[m][n];
    }
};
发布了512 篇原创文章 · 获赞 175 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/104111680