給出兩個由小寫字母組成的字串 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...