P1279 字串距离

题意:给出两个字符串,可以在两个字符串加任意空格,使其最后形成长度相等的字符串

    空格与字符匹配贡献为k  

    字符与字符匹配为两者相减的绝对值

   问,如何放空格能使答案最大

思路:题目中还出现了空格与空格匹配贡献为0的情况,很显然dp起来是不会出现这种情况的

    dp【i】【j】表示已经匹配了i个a字符,j个b字符的最优情况

      我们在匹配的时候,只有三种情况,要么是a字符匹配空字符

                      要么是b字符匹配空字符

                      要么是a与b互相匹配

      于是我们进行dp,每次匹配a字符前i个的时候,就把这前i个字符匹配(所有j)的情况都枚举一遍

  注意:预处理的时候,我们需要把dp【i】【0】和dp【0】【j】预处理出来,因为dp转移的时候要用到

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e3+10;
 4 const int inf=0x3f3f3f3f;
 5 int dp[maxn][maxn];
 6 string tmp1,tmp2;
 7 int a[maxn],b[maxn];
 8 int main()
 9 {
10     cin>>tmp1>>tmp2;
11     int k;
12     scanf("%d",&k);
13     int lena=tmp1.size();
14     int lenb=tmp2.size();
15     for(int i=0;i<lena;i++)
16         a[i+1]=tmp1[i]-'a';
17     for(int i=0;i<lenb;i++)
18         b[i+1]=tmp2[i]-'a';
19     memset(dp,inf,sizeof(dp));
20     dp[0][0]=0;
21     dp[0][1]=k;
22     dp[1][0]=k;
23     for(int i=1;i<=lena;i++) dp[i][0]=k*i;
24     for(int i=1;i<=lenb;i++) dp[0][i]=k*i;
25     for(int i=1;i<=lena;i++){
26         for(int j=1;j<=lenb;j++){
27             dp[i][j]=min(dp[i][j],dp[i-1][j]+k);
28             dp[i][j]=min(dp[i][j],dp[i][j-1]+k);
29             dp[i][j]=min(dp[i][j],dp[i-1][j-1]+abs(a[i]-b[j]));
30         }
31     }
32     printf("%d\n",dp[lena][lenb]);
33     return 0;
34 }
View Code

 

posted @ 2020-03-29 10:23  古比  阅读(208)  评论(0)    收藏  举报