P1279 字串距离
题目描述
设有字符串 XXX,我们称在 XXX 的头尾及中间插入任意多个空格后构成的新字符串为 XXX 的扩展串,如字符串 XXX 为abcbcd\verb!abcbcd!abcbcd,则字符串 abcb␣cd\verb!abcb␣cd!abcb␣cd,␣a␣bcbcd␣\verb!␣a␣bcbcd␣!␣a␣bcbcd␣ 和 abcb␣cd␣\verb!abcb␣cd␣!abcb␣cd␣ 都是 XXX 的扩展串,这里 ␣\verb!␣!␣ 代表空格字符。
如果 A1A_1A1 是字符串 AAA 的扩展串,B1B_1B1 是字符串 BBB 的扩展串,A1A_1A1 与 B1B_1B1 具有相同的长度,那么我们定义字符串 A1A_1A1 与 B1B_1B1 的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的 ASCII 码的差的绝对值,而空格字符与其他任意字符之间的距离为已知的定值K,空格字符与空格字符的距离为 000。在字符串 AAA、BBB 的所有扩展串中,必定存在两个等长的扩展串 A1A_1A1,B1B_1B1,使得 A1A_1A1 与 B1B_1B1 之间的距离达到最小,我们将这一距离定义为字符串 AAA,BBB 的距离。
请你写一个程序,求出字符串 AAA,BBB 的距离。
输入格式
输入文件第一行为字符串 AAA ,第二行为字符串 BBB。AAA,BBB 均由小写字母组成且长度均不超过 200020002000。第三行为一个整数 K(1≤K≤100)K(1\leq K\leq 100)K(1≤K≤100),表示空格与其他字符的距离。
输出格式
输出文件仅一行包含一个整数,表示所求得字符串 A,BA,BA,B 的距离。
输入输出样例 #1
输入 #1
cmc
snmn
2
输出 #1
10
C++实现
#include<bits/stdc++.h>
using namespace std;
int len1,len2,a[100010],b[100010],f[2001][2001],k;
string s1,s2;
int main()
{
cin>>s1;//输入第一个字符串
cin>>s2;//输入第二个字符串
cin>>k;//输入k
len1=s1.size();//第一个字符串长度
len2=s2.size();//第二个字符串长度
memset(f,25,sizeof(f));//初始化一个很大的数
for(int p=0;p<len1;p++)//先读ASCII码,等一下直接用
{
a[p+1]=int(s1[p]);
}
for(int p=0;p<len2;p++) b[p+1]=int(s2[p]);//先读ASCII码
for(int i=1;i<=len1;i++) f[i][0]=ik;//初始化
for(int i=1;i<=len2;i++) f[0][i]=ik;//初始化
f[0][0]=0;//初始化
for(int i=1;i<=len1;i++)//dp
{
for(int j=1;j<=len2;j++)
{
f[i][j]=min(f[i][j],f[i][j-1]+k);
f[i][j]=min(f[i][j],f[i-1][j]+k);
f[i][j]=min(f[i][j],f[i-1][j-1]+abs(a[i]-b[j]));
}
}
cout<<f[len1][len2];//输出
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P1279 字串距离&spm=1001.2101.3001.5002&articleId=146305949&d=1&t=3&u=ee4265375bdb4adaba24348dcdc9d029)
593

被折叠的 条评论
为什么被折叠?



