简单的动态规划。状态转移方程:
f[i]=Min{f[i-1]+1,Make(i)}
其中Make为自定义函数:表示取了i这个位置上的字符之后前面至少要删掉多少个才能满足条件。
代码如下:
Program Lexicon;//By_Thispoet Const maxn=300; Var i,j,k,m,n :Longint; f :Array[0..maxn]of Longint; std :Array[1..maxn*2]of String[25]; word :Array[0..maxn]of Char; temp :Longint; Function Min(i,j:Longint):Longint; begin if i<j then exit(i);exit(j); end; Function Make(i:Longint):Longint; var j,k,p,q:Longint; begin make:=maxlongint; for j:=1 to n do begin if std[j][length(std[j])]=word[i] then begin p:=0;q:=i; k:=length(std[j]); while(k>0)and(q>0)do begin while (std[j][k]<>word[q])and(q>0) do begin inc(p);dec(q); end; if std[j][k]=word[q] then begin dec(k);dec(q); end; end; if k=0 then Make:=Min(Make,p+f[q]); end; end; end; BEGIN readln(n,m); for i:=1 to m do read(word[i]);readln; for i:=1 to n do readln(std[i]); fillchar(f,sizeof(f),0); for i:=1 to m do begin temp:=Make(i); f[i]:=Min(f[i-1]+1,Temp); end; writeln(f[m]); END.
[hjp2=400,300,true]http://zhangmenshiting2.baidu.com/data/music/5800084/%E8%8B%B1%E9%9B%84.mp3?xcode=09baec1022425168097b1795eb6af7e5&r=1316564338[/hjp2]