2023年8月8日提高組T2 呀!回文串

2021-08-06 00:16:15 字數 1757 閱讀 5153

description

小b的名字是由前n個小寫字母組成的乙個長度為m字串。一天,小b看上了乙個金髮碧眼的漂亮妹子,但妹子在知道了小b的名字後,就無情地拋棄了小b,而原因竟然是小b的名字不夠優美!在小b的追問下,妹子告訴小b,只有回文串是優美的。於是小b決定把自己的名字變得優美,但每加入或刪除乙個字母都要付出一定的代價。為了小b的人生大事,請你告訴小b他最少需要付出多少代價。

input

第一行兩個數分別表示n和m。

第二行是乙個長度為m的字串,僅由前n個小寫字母組成。

接下來n行,每行含有乙個字母和兩個正整數,表示新增和刪除這個字母的費用。

output

一行乙個整數,表示最小費用。

sample input

3 4

abbc

a 10 10

b 20 20

c 30 30

sample output

hint

【資料規模與約定】

對於前30%的資料,m <= 10

對於前50%的資料,m <=100

對於前100%的資料,n<=26,m<=2000,0<=費用<=10000

分析:對於同乙個字母,刪去和新增是一樣的。設f[i,j]為把i—j變為回文數的代價。有

f[i,j]=min(f[i+1,j]+cost[s[i]],f[i,j-1]+cost[s[j]])

f[i,j]=f[i+1,j-1] {s[i]=s[j]}

**:

var

a:array [1..2001] of longint;

g:array [1..26,1..2] of longint;

f:array [0..2001,0..2001] of longint;

x,y,n,m,i,j,k,l:longint;

ch:char;

function

min(x,y:longint):longint;

begin

if xthen

exit(x)

else

exit(y);

end;

begin

readln(n,m);

for i:=1

to m do

begin

read(ch);

a[i]:=ord(ch)-96;

end;

readln;

for i:=1

to n do

begin

read(ch);

readln(g[ord(ch)-96,1],g[ord(ch)-96,2]);

end;

for k:=2

to m do

for i:=1

to m-k+1

dobegin

j:=i+k-1;

f[i,j]:=maxlongint;

if a[i]=a[j] then f[i,j]:=min(f[i,j],f[i+1,j-1])

else

begin

f[i,j]:=min(f[i,j],f[i+1,j]+min(g[a[i],2],g[a[i],1]));

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

end;

end;

writeln(f[1,m]);

end.

2023年8月8日提高組T2 呀!回文串

小b的名字是由前n個小寫字母組成的乙個長度為m字串。一天,小b看上了乙個金髮碧眼的漂亮妹子,但妹子在知道了小b的名字後,就無情地拋棄了小b,而原因竟然是小b的名字不夠優美!在小b的追問下,妹子告訴小b,只有回文串是優美的。於是小b決定把自己的名字變得優美,但每加入或刪除乙個字母都要付出一定的代價。為...

2023年8月9日提高組T2 覆蓋

現在小b拿到了一條長度為n的木塊,初始時上面什麼顏色都沒有。為了美觀,現在小b希望把它的n個單位長度分別塗上紅 綠 藍三種顏色,每種顏色可以用乙個大寫字母表示,分別是 rgb。作為乙個不合格的油漆工,每次你可以把一段連續的木版塗成隨意一種顏色,但是你發現,後塗的顏色會覆蓋先塗的顏色。為了方便,請你用...

2023年8月15日提高組T2 購買

bpm想要購買m種物品,每種物品只用購買一件。現在一共有n家商店,但走到第i家商店的路費為d i 而在第i家商店購買第j種物品的花費為c i,j 問你最少需要花費多少錢。第一行包含兩個正整數n,m,表示商店數和物品數。接下來n行,每行先是乙個正整數d i 表示到第i家商店的路費。接下來m個正整數,依...