顺序对齐
源程序名 ALIGN.??? (PAS,C,CPP)
可执行文件名 ALIGN.EXE
输入文件名 ALIGN.IN
输出文件名 ALIGN.OUT
考虑两个字符串右对齐的最佳解法。例如,有一个右对齐方案中字符串是AADDEFGGHC和ADCDEGH。
AAD_DEFGGHC
ADCDE__GH_
每一个数值匹配的位置值2分,一段连续的空格值-1分。所以总分是匹配点的2倍减去连续空格的段数,在上述给定的例子中,6个位置(A,D,D,E,G,H)匹配,三段空格,所以得分2*6+(-1)*3=9,注意,我们并不处罚左边的不匹配位置。若匹配的位置是两个不同的字符,则既不得分也不失分。
请你写个程序找出最佳右对齐方案。
输入
输入文件包含两行,每行一个字符串,最长50个字符。字符全部是大字字母。
输出
一行,为最佳对齐的得分。
样例
ALIGN.IN
AADDEFGGHC
ADCDEGH
ALIGN.OUT
9
=================================
===============================
var
st1,st2:string;
f:array[0..50,0..50]of longint;
procedure init;
begin
assign(input,'align.in');
assign(output,'align.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure main;
var
i,j,k:longint;
st1_l,st2_l:longint;
begin
readln(st1); readln(st2);
st1_l:=length(st1);
st2_l:=length(st2);
for i:=0 to 50 do
for j:=0 to 50 do f[i,j]:=-1000000;
for i:=0 to st1_l do f[i,0]:=0;
for i:=0 to st2_l do f[0,i]:=0;
for i:=1 to st1_l do
for j:=1 to st2_l do
begin
if st1[i]=st2[j] then
begin
if f[i-1,j-1]+2>f[i,j] then f[i,j]:=f[i-1,j-1]+2;
end
else
if f[i-1,j-1]>f[i,j] then f[i,j]:=f[i-1,j-1];
for k:=1 to i-1 do
if f[i,j]<f[k,j]-1 then f[i,j]:=f[k,j]-1;
for k:=1 to j-1 do
if f[i,j]<f[i,k]-1 then f[i,j]:=f[i,k]-1;
end;
writeln(f[st1_l,st2_l]);
end;
begin
init;
main;
terminate;
end.