動態規劃入門之求字串距離

2021-08-02 05:33:09 字數 1872 閱讀 1573

題目:求字串之間距離

要求:設有字串x,稱在x的頭尾及中間插入任意多個空格後構成的新字串為x的擴充套件串,如字串x為「abcbcd」,則字串「abcb□cd」,「□a□bcbcd□」和「abcb□cd□」都是x的擴充套件串,這裡「□」代表空格字元。如果a1是字串a的擴充套件串,b1是字串b的擴充套件串,a1與b1具有相同的長度,那麼定義字串a1與b1的距離為相應位置上的字元的距離總和,而兩個非空格字元的距離定義為它們的ascii碼的差的絕對值,而空格字元與其它任意字元之間的距離為已知的定值k,空格字元與空格字元的距離為0。在字串a、b的所有擴充套件串中,必定存在兩個等長的擴充套件串a1、b1,使得a1與b1之間的距離達到最小,將這一距離定義為字串a、b的距離。請編寫程式,求出字串a、b的距離。

思想:這道題目其實可以用乙個二維陣列來求解的,在分析這道題之前,我想先分析一道用一維陣列來借的一道題。

題目的大致意思就是我們手上有3種硬幣,面值分別為1元,3元,5元。問怎麼用最少的硬幣個數來湊11元。

對於這個湊11元,我們可以從最開始的想法來想,假設是湊0元,那麼肯定是0個硬幣;如果是1元,那麼只要乙個1元硬幣;2元的話2個;3元是1個3元硬幣,這個過程又怎麼讓計算機思考呢?

這就是我今天要說的動態規劃(由於我也是小白,只能說點入門的東西),我們讓計算機這麼想這個問題,先建立乙個陣列int   a[12](因為我的題目是湊11元,然後後有0-11  12個數字,故取12),a[i]中的i表示的意思湊多少元,a[i]表示湊i元最少的硬幣數目,顯然a[0]=0       a[1]=1    a[2]=2,對於a[3]我們應該這麼想,湊3元有兩種方法,第一種是在2元的基礎上加乙個1元硬幣,此時a[3]=a[2]+1;還有一種方法是在0元的基礎上加乙個3元硬幣,此時a[3]=a[0]+1(當然有些人會覺得肯定用3元的時候硬幣少啦,這麼想肯定是沒錯的,大家可以看看這個例子,假設這裡沒有5元硬幣的話,我們湊5元的話可以是兩元加乙個3元硬幣3個,也可能是四元加乙個1元硬幣,都是3個,這裡為了邏輯的嚴密性故給出兩種。)。所以這個時候的a[3]應該是上面兩種情況中小的那一種,當然當i元大於等於3元的時候也要這麼思考,可能是由i-1元加乙個1元硬幣,也可能是i-3加乙個3元硬幣,然後在這兩種中取小。當然對於5元的硬幣思考也是這樣的。

具體**如下

#include

using namespace std;

intq(int i)

else

if(m>=3)

else

a[m]=m;

}return a[i];

}int main()

看完了這個問題我們再回到一開始的這個字串的問題,對於這個問題,如果我們比較乙個n字長和m字長的兩個字串,我們先建立乙個二維陣列a[n+1][m+1],我們如果要求a[i][j]的話,下標的意思為第乙個前i長度與第二個字串前m長度的距離最小值,這個問題其實有3種情況:1.可能是a[i-1][j-1]加上第乙個字串的第i位與第二個字串的第j位的ascll的差值(當前比較的是兩個字元)2.可能是a[i-1][j]+k(當前位與空格的差,即當前比較的是乙個字元與乙個空格),3.a[i][j-1]+k(當前位與空格的差,即當前比較的是乙個字元與乙個空格)。

具體**如下

#include 

#include

#include

using

namespace

std;

const

int n = 2005;

char s[n], t[n];

int dp[n][n];

//動態規劃問題

int work(char *s, char *t, int k)

int main()

以上就是我對這個問題的一些看法,謝謝瀏覽

動態規劃之字串最短編輯距離

題目描述給定兩個字串a和b,現在要將a經過若干操作變為b,可進行的操作有 刪除 將字串a中的某個字元刪除。插入 在字串a的某個位置插入某個字元。替換 將字串a中的某個字元替換為另乙個字元。現在請你求出,將a變為b至少需要進行多少次操作。輸入格式第一行包含整數n,表示字串a的長度。第二行包含乙個長度為...

動態規劃 計算字串編輯距離

題目 設a 和b 是2 個字串。要用最少的字元操作將字串a 轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b 所用的最少字元運算元稱為字串a到b 的編輯距離,記為d a,b 試設計乙個有效演算法,對任給的2 個字串a和b,計...

動態規劃 之字串編輯距離 難度 2星

include 對於序列s和 t,它們之間距離定義為 對二者其一進行幾次以下的操作 1 刪去乙個字元 2 插入乙個字元 3 改變乙個字元。每進行一次操作,計數增加1。將s和 t變為同乙個字串的最小計數即為它們的距離。給出相應演算法。define min x,y x define inf 50000 ...