动态规划

Posted 于光远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划相关的知识,希望对你有一定的参考价值。

计算出最接近的单词

通过最小的改动,使2个单词相同。

 

  1. 从第一个单词wordA,到第二个单词wordB,有三种操作:
    • 删除一个字符
    • 添加一个字符
    • 替换一个字符

综合上述三种操作,用最少步骤将单词wordA变到单词wordB,我们就称这个值为两个单词之间的距离。比如 pr1ce -> price,只需要将 1 替换为 i 即可,所以两个单词之间的距离为1。pr1ce -> prize,要将 1 替换为 i ,再将 c 替换为 z ,所以两个单词之间的距离为2

求解任意两个单词之间的距离,只要知道之前单词组合的距离即可。我们用dp[i][j]表示第一个字符串wordA[0…i] 和第2个字符串wordB[0…j] 的最短编辑距离,那么这个动态规划的两个重要参数分别是:

  • 初始化状态为数组a[][] ={0}
  • 状态转移方程:a[i+1][j+1] = max(a[i ][j ], a[i + 1][j], a[i][j + 1])        //最大相同数 
#include <iostream>
#include <string>
#include <algorithm>
#include<vector>
using namespace std;
int wordDistance(string w1, string w2){
    int size1 = w1.size();
    int size2 = w2.size();
    vector<vector<int>> a(size1+1, vector<int>(size2+1));
    for (size_t i = 0; i < size1; i++)
    {
        for (size_t j = 0; j < size2; j++)
        {
            if (w1[i] == w2[j]){
                a[i+1][j+1] = a[i][j]+1;
            }
            else{

                a[i+1][j+1] = max(max(a[i][j + 1], a[i + 1][j]),a[i][j]) ;
            }
        }
    }
    int size = size2>size1 ? size2 : size1;
    return (size - a[size1][size2]);
}
int main()
{
    cout << wordDistance("asdfg", "gfdsaadf")<<endl;
}

 

以上是关于动态规划的主要内容,如果未能解决你的问题,请参考以下文章

是否可以动态编译和执行 C# 代码片段?

动态规划_线性动态规划,区间动态规划

应对笔试手写代码,如何准备动态规划?

应对笔试手写代码,如何准备动态规划?

应对笔试手写代码,如何准备动态规划?

算法动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )