leetcode Edit Distanc (DP)

本文详细阐述了使用动态规划算法解决字符串转换问题的过程,包括初始化、状态转移方程及边界条件的设定,并通过实例代码展示了解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Edit Distance Total Accepted: 5097 Total Submissions: 20793 My Submissions
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)


You have the following 3 operations permitted on a word:


a) Insert a character
b) Delete a character
c) Replace a character


第一个自己做出来的DP题啊!

注意到增和删其实是一样的效果,增加A里面的一个字符,就等于把B里面多的那个字符删掉。所以就是比较删A还是删B,就是d[i][j] = min(d[i-1][j], d[i][j-1]

然后再加上这次的增或删操作就是+1.


// 第一次做把这种情况给漏了

然后还有以一种就是当前位置A[i]和B[i]的字符做替换,这种就是说看看A[i-1],  B[i-1]是否相等了,相等就是做替换最小。 就是d[i][j] = min(上面两个, d[i-1][j-1])

然后在加上这次的替换操作就是+1.



因此 d[i][j] = min(d[i-1][j], d[i][j-1], d[i-1][j-1]) + 1;


因此状态转移方程为:

                if (word1[i] == word2[j]) {
                    d[i][j] = d[i-1][j-1];
                } else {
                    d[i][j] = min(d[i-1][j], d[i][j-1], d[i-1][j-1]) + 1;
                }

注意初始化。


所以这道题没写出状态方程之前,就可以大概感觉到,实际上是2D/0D的问题,因为比较明显只依赖于O(n^0)的子问题来推导当前子问题,一共有O(n^2)个子问题。然后就可以从d[0][0]开始手算,来验证想法。确实是依赖于O(1)的子问题的。



class Solution {
public:
 int minDistance(string word1, string word2) {
    if (word1.size() == 0 && word2.size() == 0) return 0;
    if (word1.size() == 0) return word2.size();
    if (word2.size() == 0) return word1.size();


    vector<vector<int> > d;
    d.resize(word1.size());
    for (int i = 0; i < d.size(); ++i) {
        d[i].resize(word2.size(), 0);
    }


    if (word1[0] == word2[0])
        d[0][0] = 0;
    else
        d[0][0] = 1;


    for (int i = 1; i < word1.size(); ++i) {
        if (word1[i] == word2[0])
            d[i][0] = i;
        else
            d[i][0] = d[i-1][0] + 1;
    }
    for (int i = 1; i < word2.size(); ++i) {
        if (word2[i] == word1[0])
            d[0][i] = i;
        else
            d[0][i] = d[0][i-1] + 1;
    }


    for (int i = 1; i < word1.size(); ++i) {
        for (int j = 1; j < word2.size(); ++j) {
            if (word1[i] == word2[j]) {
                d[i][j] = d[i-1][j-1];
            } else {
                d[i][j] = min(d[i-1][j], d[i][j-1]);
                d[i][j] = min(d[i][j], d[i-1][j-1]);
                d[i][j] += 1;
            }
        }
    }
    return d[word1.size()-1][word2.size()-1];
}
};
内容概要:本文档详细介绍了一个基于MATLAB实现的电力负荷预测项目,该项目运用遗传算法(GA)优化支持向量回归(SVR)和支持向量机(SVM)模型的超参数及特征选择。项目旨在解决电力系统调度、发电计划、需求侧响应等多个应用场景中的关键问题,特别是在应对高比例可再生能源接入带来的非线性、非平稳负荷预测挑战。文中涵盖了从数据接入、特征工程、模型训练到部署上线的全流程,包括详细的代码示例和GUI设计,确保方案的可复现性和实用性。 适用人群:具备一定编程基础,尤其是熟悉MATLAB语言和机器学习算法的研发人员;从事电力系统调度、电力市场交易、新能源消纳等相关领域的工程师和技术专家。 使用场景及目标:①通过构建面向小时级别的滚动预测,输出高分辨率负荷轨迹,为日内与日前滚动调度提供边际成本最小化的依据;②在负荷高峰和供给紧张时,通过价格信号或直接负荷控制实施需求侧响应,提升削峰效率并抑制反弹;③为灵活性资源(调峰机组、储能、可中断负荷)提供更清晰的出清路径,降低弃风弃光率,提升系统整体清洁度;④帮助市场主体更准确地评估边际出清价格变化,提高报价成功率与收益稳定性,同时降低由预测偏差带来的风险敞口;⑤在运维与审计场景中,对预测产生的原因进行说明,保障业务侧与监管侧的可追溯性。 阅读建议:此资源不仅提供了完整的代码实现和GUI设计,更注重于理解GA优化过程中涉及到的数据处理、特征构造、模型选择及评估等核心步骤。因此,在学习过程中,建议结合实际案例进行实践,并深入研究每个阶段的具体实现细节,特别是适应度函数的设计、超参数空间的定义以及多样性维护机制的应用。此外,关注项目中关于数据对齐、缺失值处理、特征标准化等方面的最佳实践,有助于提高模型的鲁棒性和泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值