字符串的距离
題目:http://wikioi.com/problem/2180/
?
題意:設(shè)有字符串X,我們稱在X的頭尾及中間插入任意多個(gè)空格后構(gòu)成的新字符串為X的擴(kuò)展串,如字符串X為“abcbcd”,則
字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的擴(kuò)展串,這里“□”代表空格字符。如果A1是字符串A的擴(kuò)展串,
B1是字符串B的擴(kuò)展串,A1與B1具有相同的長(zhǎng)度,那么我們定義字符串A1與B1的距離為相應(yīng)位置上的字符的距離總和,而兩個(gè)
非空格字符的距離定義為它們的ASCII碼的差的絕對(duì)值,而空格字符與其它任意字符之間的距離為已知的定值K,空格字符與空
格字符的距離為O。在字符串A、B的所有擴(kuò)展串中,必定存在兩個(gè)等長(zhǎng)的擴(kuò)展串A1、B1,使得A1與B1之間的距離達(dá)到最小,我
們將這一距離定義為字符串A、B的距離,請(qǐng)你寫一個(gè)程序,求出字符串A、B的距離。
?
#include <iostream> #include <string.h> #include <algorithm> #include <stdio.h>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 n = strlen(S);int m = strlen(T);dp[0][0] = 0;for(int i=1;i<=n;i++)dp[i][0] = i * k;for(int i=1;i<=m;i++)dp[0][i] = i * k;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)dp[i][j] = min(dp[i-1][j-1] + abs(S[i-1] - T[j-1]),min(dp[i-1][j],dp[i][j-1]) + k);return dp[n][m]; }int main() {int d;while(cin>>S>>T>>d)cout<<Work(S,T,d)<<endl;return 0; }
?
總結(jié)