【DP】顺序对齐


 顺序对齐

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值