【C++】20行带空间优化动态规划

最小编辑代价

http://www.nowcoder.com/questionTerminal/05fed41805ae4394ab6607d0d745c8e4

class Solution {
public:
    int minEditCost(string &str1, string &str2, int &ic, int &dc, int &rc) {
        int num1 = str1.size(), num2 = str2.size();
        int dp[num2 + 1]; //记录每行遍历结果
        for(int j = 0; j <= num2; j++) dp[j] = j * ic; //长度0的str1到长度i的str2,全部插入代价最小
        for(int i = 1; i <= num1; i++ ) {
            int pre = dp[0]; //记录左上角的值
            dp[0] = i * dc; //长度i的str1到长度0的str2,全部删除代价最小
            for(int j = 1; j <= num2; j++) { //现在我们要求长度i的str1到长度j的str2的最小代价
                int insert = dp[j - 1] + ic; //长度i的str1到长度j-1的str2的最小代价上,加上插入str2[j-1]的代价
                int del = dp[j] + dc; //先有删除str1[i-1]的代价,再加上长度i-1的str1到长度j的str2的最小代价
                int modify = pre + (str1[i - 1] == str2[j - 1] ? 0 : rc); //长度i-1的str1到长度j-1的str2的最小代价上,加上不修改末位的代价0或修改末位的代价
                pre = dp[j]; //上面的值在下次循环时成为左上角的值
                dp[j] = min(insert, min(del, modify)); //获得当前最小代价
            }
        }
        return dp[num2]; //返回str1到str2的最小代价
    }
};
全部评论

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务