【DP】顺序对齐

来源:互联网 发布:java dao模式 编辑:程序博客网 时间:2024/06/03 05:43

 顺序对齐

源程序名   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.

 

原创粉丝点击