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 }