码迷,mamicode.com
首页 > 编程语言 > 详细

算法第三章上机实践报告

时间:2019-10-18 15:35:21      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:stream   经典的   for   ons   length   space   转换   数组   保存   

 

1.实践题目

7-3 编辑距离问题

设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。

 

2.问题描述

给定a串、b串,对a串进行三种字符操作转换成b串,计算最少操作数。

 

3.算法描述

 

动态规划,从上到下从左往右填lena*lenb的表格,两层for循环匹配,字母相同填左上,失配时要对字符进行操作,操作数?1,即左上的值?1,与左边和上边的值+1比较大小,取min更新,最后递推到右下角dp[lena][lenb]为所求答案

 

代码:

#include<iostream>

using namespace std;

const int maxn=2e3+10;

int dp[maxn][maxn];

int main()

{

    string a,b;

    cin>>a>>b;

    int lena=a.length(),lenb=b.length();

    for(int i=0;i<=lena;i++)

        dp[i][0]=i;

    for(int i=0;i<=lenb;i++)

        dp[0][i]=i;

    for(int i=1;i<=lena;i++)

        for(int j=1;j<=lenb;j++){

            if(a[i-1]==b[j-1]){

                dp[i][j]=dp[i-1][j-1];

            }

            else{

                dp[i][j]=dp[i-1][j-1]+1;

            }

            dp[i][j]=min(min(dp[i-1][j],dp[i][j-1])+1,dp[i][j]);

        }

    cout<<dp[lena][lenb]<<endl;

}

 

4.算法时间及空间复杂度分析

dp过程的时间复杂度是O(lena*lenb)即O(n^2)

用二维数组保存子问题的解,空间复杂度是O(n^2)

 

5.心得体会

 

通过经典的题目加深了对动态规划算法的理解,上机的时候很懵逼第一题就敲了很久,还好队友小姐姐思维很清晰,超耐心的和我讲了她的思路然后顺利敲出来!感受到了dp的巧妙和实用,要继续锻炼思维和学习算法。

 

算法第三章上机实践报告

标签:stream   经典的   for   ons   length   space   转换   数组   保存   

原文地址:https://www.cnblogs.com/biekanle/p/11698359.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!