2016東莞市特長生考試 字串距離 dp

2021-07-30 06:32:06 字數 1784 閱讀 5858

2016東莞市特長生考試 字串距離

description

設有字串 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 的距離。

input

從檔案 blast.in 中讀入資料,輸入檔案第一行為字串 a,第二行為字串 b。 

a、b 均由小寫字母組成且長度均不超過 2000。第三行為乙個整數 k(1≤k≤100), 

表示空格與其他字元的距離。

output

輸出到檔案 blast.out 中,僅一行包含乙個整數,表示所求得字串 a、b 的距離。

分析:和最長公共子串差不多的動態規劃,f[i,j]表示a串中前i個字元與b串中前j個字元的最短距離,a[i]表示a中第i位字元的ascll碼

f[i,j]=min(f[i-1,j]+k,f[i,j-1]+k,f[i-1,j-1]+abs(a[i]-b[j]))

**

const

maxn=2000;

varf:array[0..maxn,0..maxn] of longint;

a,b:array[0..maxn] of longint;

s1,s2:ansistring;

i,j,k,n:longint;

function min(x,y:longint):longint;

begin

if xend;

begin

readln(s1);

readln(s2);

readln(k);

for i:=1 to length(s1) do

a[i]:=ord(s1[i]);

for i:=1 to length(s2) do

b[i]:=ord(s2[i]);

for i:=1 to length(s1) do

f[i,0]:=i*k;

for i:=1 to length(s2) do

f[0,i]:=i*k;

for i:=1 to length(s1) do

for j:=1 to length(s2) do

begin

f[i,j]:=f[i-1,j]+k;

f[i,j]:=min(f[i,j],f[i,j-1]+k);

f[i,j]:=min(f[i,j],f[i-1,j-1]+abs(a[i]-b[j]));

end;

writeln(f[length(s1),length(s2)]);

end.

2016東莞市特長生考試 遊戲問題

2016東莞市特長生考試 遊戲問題 description 五四 青年節到了,某學校要舉行乙個遊園活動,其中有乙個這樣的遊戲 n 個同學 編號從 0 到 n 1 圍坐一圈,按照順時針方向給 n 個位置編號,從0 到 n 1。最初,第 0 號同學在第 0 號位置,第 1 號同學在第 1 號位置,依此類...

2016東莞市特長生考試 子數整數

對於乙個五位數,可將其拆分為三個數字 sub1 a1a2a3,sub2 a2a3a4,sub3 a3a4a5 現在給定乙個正整數 k,要求你程式設計求出 10000 包括 10000 到 30000 包括 30000 之間所有滿足下述條件的五位數,條件是這些五位數的三個子數 sub1,sub2,su...

2016東莞市特長生考試 村莊重建

2016東莞市特長生考試 村莊重建 time limit 10000ms memory limit 256000k total submit 3 accepted 1 case time limit 1000ms description b 地區在 過後,所有村莊都造成了一定的損毀,而這場 卻沒對公...