dijkstra万岁!!!!! 一开始听说是用字符串背包来解,后来经过仔细思考过后发现dijkstra也完全可以做而且dijkstra的难度比较低,理解也更容易些。 program P1102; var s:ansistring; n:longint; a:array [1..110] of string; d:array [1..110,1..110] of longint; v:array [1..110] of longint; b:array [1..110] of boolean; procedure init; var i,j:longint; temp:ansistring; begin fillchar(b,sizeof(b),false); fillchar(v,sizeof(v),100); fillchar(d,sizeof(d),100); v[1]:=0; readln(s); readln(n); for i:=1 to n do readln(a[i]); for i:=1 to length(s) do begin for j:=1 to n do begin if (s[i]=a[j,1]) and (length(a[j])<>1) then//如果单词不是一个字母的话,先看能否从原字串中截出这个单词,如果能,那么距离为1 begin temp:=copy(s,i,length(a[j])); if temp=a[j] then d[i,i+length(a[j])]:=1; end; if (s[i]=a[j,1]) and (length(a[j])=1) then d[i,i+1]:=1;//如果只有一个字母,那么要用这个字母组成的话,就是当前位置到后一个位置的距离是1 end; end; end; procedure dijkstra; var i,j,min,p:longint; begin for i:=1 to length(s)+1 do begin min:=maxlongint; for j:=1 to length(s)+1 do begin if (not b[j]) and (v[j]<min) then begin min:=v[j]; p:=j; end; end; b[p]:=true; for j:=1 to length(s)+1 do if (not b[j]) and (d[p,j]+v[p]<v[j]) then v[j]:=d[p,j]+v[p]; end; end; begin assign(input,'word.in'); reset(input); assign(output,'word.out'); rewrite(output); init; dijkstra; writeln(v[length(s)+1]);//因为我们都把每一个位置加了1,所以要求的最终位置也要加1 close(input); close(output); end.