2014廣州市選day1 字串距離題解

2021-10-09 09:33:43 字數 1717 閱讀 1902

給出兩個由小寫字母組成的字串 x 和y ,我們需要算出兩個字串的距離,定義如下:

1)我們可以在字串的頭、尾、中間插入若干空格,組成乙個新的擴充套件串

2)對x擴充套件成擴充套件串x1,對y擴充套件成擴充套件串y1,並且令x1和y1具有相同的長度

3)定義x1、y1的距離為每個對應的字元的距離之和,其中兩個空格的距離為0,兩個非空格字元的距離為其ascii碼之差的絕對值,乙個空格字元到任意非空格字元的距離為k

4)對於字串x、y,必然存在兩個等長的擴充套件串x1、y1,使得x1、y1的距離達到最少,我們將這一距離定義為字串x、y的距離

經過觀察可以發現,其實我們並不需要在乎兩個字串經過任意操作後的長度是否相等(我們可以用空格把它們填滿),我們只在乎兩個字串誰和誰匹配,所以可以想到dp。

設f [i

][j]

f[i][j]

f[i][j

]表示字串x的第i個字元和字串y的第j個字元匹配,包括了前面的匹配的最小代價。

狀態轉移方程:f[i

][j]

=min

(f[i

][j]

,f[i

1][j

1]+d

is(i

,j)+

(i−i

1+j−

j1)∗

k)

f[i][j]=min(f[i][j],f[i1][j1]+dis(i,j)+(i-i1+j-j1)*k)

f[i][j

]=mi

n(f[

i][j

],f[

i1][

j1]+

dis(

i,j)

+(i−

i1+j

−j1)

∗k)解釋一下,其中的dis

(i,j

)dis(i,j)

dis(i,

j)表示第i個字元和第j個字元的距離,而其中的(i−

i1+j

−j1)

∗k

(i-i1+j-j1)*k

(i−i1+

j−j1

)∗k表示i1+

1i1+1

i1+1

到i

ii和j1+

1j1+1

j1+1

到j

jj的字串都與空格匹配。這樣做是正確的,我們可以不斷地給中間增加空格讓這些字元都與空格匹配。

最後統計答案的時候就找到一對匹配,讓後面的字元全部與空格匹配就行了。很容易打。

#include

#include

#define re register

#define fo(x,a,b) for(re int x=a;x<=b;++x)

using

namespace std;

int k,ans=

0x7f7f7f7f

;int a[2]

[31],f[31]

[31];

inline

void

read

(int x)

intmain()

printf

("%d"

,ans)

;fclose

(stdin);

fclose

(stdout);

return0;

}

2014廣州市選day1 倒數運算

倒數,顧名思義就是用1除以被倒數得出的結果,例如2的倒數是0.5,0.5的倒數是2。現在我們需要獲得正有理數的倒數。正有理數的表示格式 整數部分 小數點 小數非迴圈部分 迴圈部分 其中 為必填部分,為可選部分,如果選了小數點,則後面肯定有小數部分。正有理數的表示要求 整數部分十位數字以後不能有多餘的...

day1 字串格式化

1 import datetime 2 today datetime.datetime.today 當天的日期 3for i in range 3 4 username input 請輸入你的名字 5 welcome 歡迎 s 登入,今天的日期是 s username,today 6print we...

Day1 字串格式化

1.佔位符方式 佔位符 d 整數 012d 數字位數至少長度為12位,不足的前面加0填充。hello,s,012d a 1234567890123456 hello,a,1234567890123456 hello,s,012d a 123 hello,a,000000000123 f 浮點數 4f...