1. 程式人生 > >[作業系列]算法第3章上機實踐報告

[作業系列]算法第3章上機實踐報告

cpp 復雜 clas style 心得 轉換 ng- ++ -s

1.實踐題目

7-3編輯距離問題

2.問題描述

設A和B是2個字符串。要用最少的字符操作將字符串A轉換為字符串B。這裏所說的字符操作包括 (1)刪除一個字符; (2)插入一個字符; (3)將一個字符改為另一個字符。 將字符串A變換為字符串B所用的最少字符操作數稱為字符串A到 B的編輯距離,記為d(A,B)。 對於給定的字符串A和字符串B,計算其編輯距離 d(A,B)。

輸入格式:

第一行是字符串A,文件的第二行是字符串B。

提示:字符串長度不超過2000個字符。

輸出格式:

輸出編輯距離d(A,B)

輸入樣例:

在這裏給出一組輸入。例如:

fxpimu

xwrs

輸出樣例:

在這裏給出相應的輸出。例如:

5


3.算法描述

設A串長度為l1,B串長度為l2,那麽開一個dp[i][j]記錄當長度為i的A串的時候變成長度為j的B串時的最短編輯距離。那麽dp[0...l1][0]初始化為0...l1,dp[0][0...l2]初始化為0...l2.

那麽dp[i][j]的狀態轉移方程就是

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

  //也就是由dp[i][j-1]+1和dp[i-1][j]+1和dp[i-1][j-1]+(a[i-1]!=b[j-1])的最小值轉移過來的;

當時做的時候沒想太多,交了一發有bug的代碼但是過了,應該是樣例沒特意卡空串。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 2005;
char a[maxn];
char b[maxn];
int dp[maxn][maxn];
int main()
{
  cin>>a;
  cin>>b;
  int ans = 0;
  int flag = 0;
  int l1 = strlen(a);
  int l2 = strlen(b);
  if(l1==0)
    ans = l2;
  else if(l2==0)
    ans = l1;
  else
  {
	for(int i = 1;i<=l1;i++)
	    dp[i][0]=i;
	for(int j =1;j<=l2;j++)
	    dp[0][j]=j;
	for(int i = 1;i<=l1;i++)
	{
		for(int j = 1;j<=l2;j++)
		{
			if(a[i-1]==b[j-1])
			  flag = 0;
			else
			  flag = 1;
			dp[i][j]=min(min(dp[i][j-1]+1,dp[i-1][j]+1),dp[i-1][j-1]+flag);
		}
	}
  }
	cout<<dp[l1][l2]<<endl;
}

  很明顯上面的代碼是有bug的,因為我用cin輸入根本就不需要特判l1還有l2是否為0,不過當時沒有在意這個細節,現附上改進代碼

#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 2005;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main()
{
	cin.getline(a,2001);
	cin.getline(b,2001);
	int l1 = strlen(a);
	int l2 = strlen(b);
	for(int i = 1;i<=l1;i++)
	  dp[i][0]=i;
	for(int j =1;j<=l2;j++)
	  dp[0][j]=j;
	for(int i = 1;i<=l1;i++)
	  for(int j = 1;j<=l2;j++)
		dp[i][j]=min(min(dp[i][j-1]+1,dp[i-1][j]+1),dp[i-1][j-1]+(a[i-1]!=b[j-1]));
	cout<<dp[l1][l2]<<endl;
}

4.算法時間和空間復雜度

  兩層for循環,時間復雜度是O(l1*l2);

  二維dp數組,空間復雜度是O(l1*l2);

5.心得體會

  對dp還是不夠熟悉,第三題用了十來二十分鐘才弄出dp方程式,如果是權哥估計看到題目沒過多久就能弄出來了

由於隊內分工的時候dp是權哥搞的,所以我對dp的熟悉度不算太高,導致做題的時候用的時間比我想象中要多,感覺還是要多做一點dp的題目保持對dp的題感。(雖然正式比賽的時候dp也是權哥搞的,我最多也就和他討論一下思路)

[作業系列]算法第3章上機實踐報告