【dp】字符串比较问题

问题描述:

 对于长度相同的2个字符串A和 B,其距离定义为相应位置字符距离之和。2 个非空格字符的  距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距离为一定  值k。

 在一般情况下,字符串 A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符  所产生的字符串。在字符串 A 和 B 的所有长度相同的扩展中,有一对距离最小的扩展,该  距离称为字符串A和B的扩展距离。

 对于给定的字符串A和B,试设计一个算法,计算其扩展距离。

编程任务:

 对于给定的字符串A和B,编程计算其扩展距离。

数据输入:

 由文件input.txt给出输入数据。第 1 行是字符串A;第2 行是字符串 B。第 3行是空格与其它  字符的距离定值k。

结果输出:

 将计算出的字符串A和B的扩展距离输出到文件output.txt。

样例:

 cmc

 snmn

 2

10

核心思想:

 类似于编辑距离,f[i,j]=min{f[i-1,j]+k,f[i,j-1]+k,f[i-1,j-1]+dist(i,j)} s1前i个字符s2前j个字符的最  短扩展距离,初始化f[i,0],f[0,j]

var
 s1,s2:ansistring;
 f:array[0..6000,0..6000]of longint;
 i,j,l1,l2,k:longint;
function min(a,b:longint):longint;
begin
 ifa>b then exit(b);
 exit(a);
end;
begin
 assign(input,'p319.in');reset(input);
 assign(output,'p319.out');rewrite(output);
 readln(s1);
 readln(s2);
 readln(k);
 fillchar(f,sizeof(f),100);
 f[0,0]:=0;
 l1:=length(s1);
 l2:=length(s2);
 fori:=1 to l1 do
 f[i,0]:=f[i-1,0]+k;
 fori:=1 to l2 do
 f[0,i]:=f[0,i-1]+k;
 fori:=1 to l1 do
  forj:=1 to l2 do
  f[i,j]:=min(min(f[i-1,j],f[i,j-1])+k,f[i-1,j-1]+abs(ord(s1[i])-ord(s2[j])));
 writeln(f[l1,l2]);
 close(input);close(output);
end.
题目来源:《算法设计与分析》第三章动态规划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值