P2453 [SDOI2006]最短距离

题目描述

一种EDIT字母编辑器,它的功能是可以通过不同的变换操作可以把一个源串X [l..m]变换为新的目标串y[1..n]。EDIT提供的变换操作有:

源串中的单个字符可被删除(delete);

被替换 (replace);

被复制到目标串中去(copy);

字符也可被插入(insert);

源串中的两个相邻字符可进行交换并复制到目标串中去(twiddle);

在完成其它所有操作之后,源串中余下的全部后缀就可用删至行末的操作删除(kill)。

例如,将源"algorithm"转换成目标串"altruistic"的一种方法是采取下面的操作序列:

要达到这个结果还可能有其它一些操作序列。

操作delete,replace,copy,insert,twiddle和kill中每一个都有一个相联系的代价cost。例如

cost(delete)=3;
cost(replace)=6;
cost(copy)=5;
cost(insert)=4;
cost(twiddle)=4;
cost(kill)=被删除的串长*cost(delete)-1;

一个给定的操作序列的代价为序列中各操作代价之和。 例如上述操作序列的代价为

3*cost(copy)+2*cost(replace)+cost(delete)+3*cost(insert) + cost(twiddle) +cost(kill)

=3*5+2*6+3+3*4+4+1*3-1=48

编程任务:

给定两个序列x[1..m],y[1..n]和一些操作代价集合,X到Y的最短距离为将X转化为Y的最小的转换序列的代价。请给出一个算法来找出x[1..m]至y[1..n]的最短距离。

输入输出格式

输入格式:

 

第一行:源序列x[1..m]。(m<200)

第二行:目标序列y[1..n]。(n<200)

第三行:5个正整数(<100):分别是:delete 、replace 、copy、 insert、 twiddle的代价。

 

输出格式:

 

X到Y的最短距离(最小代价和)。

 

输入输出样例

输入样例#1: 
algorithm
altruistic
3 6 5 4 4
输出样例#1: 
48

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #define maxn 210
 6 using namespace std;
 7 int Delete,Replace,Copy,Insert,Twiddle,f[maxn][maxn];
 8 string x,y;
 9 int dp(){
10     int lx=x.length();
11     int ly=y.length();
12      f[0][0]=0;
13     for(int i=1;i<=lx;i++)
14         f[i][0]=i*Insert;
15     for(int j=1;j<=ly;j++)
16         f[0][j]=j*Delete;
17     for(int i=1;i<=lx;i++)
18         for(int j=1;j<=ly;j++){
19             f[i][j]=min(f[i][j],f[i-1][j-1]+Replace);
20             f[i][j]=min(f[i][j],f[i][j-1]+Delete);
21             f[i][j]=min(f[i][j],f[i-1][j]+Insert);
22             if(x[i-1]==y[j-1]){
23                 f[i][j]=min(f[i][j],f[i-1][j-1]+Copy);
24             }    
25             if(j>1&&i>1&&x[i-2]==y[j-1]&&x[i-1]==y[j-2]){
26                 f[i][j]=min(f[i][j],f[i-2][j-2]+Twiddle);
27             }
28         }
29         int ans=f[lx][ly];
30     for(int j=1;j<ly;j++)
31         ans=min(ans,f[lx][j]+Delete*(ly-j)-1);
32     return ans;
33 }
34 int main(){
35     cin>>y>>x;
36     cin>>Delete>>Replace>>Copy>>Insert>>Twiddle;
37     memset(f,0x3f3f3f,sizeof(f));
38     int answer=dp();
39     cout<<answer<<endl;;
40     return 0;
41 }

 





posted @ 2018-04-03 12:10  pjhui  阅读(336)  评论(0)    收藏  举报