打卡信奥刷题(970)用C++实现信奥 P1279 字串距离

P1279 字串距离

题目描述

设有字符串 XXX,我们称在 XXX 的头尾及中间插入任意多个空格后构成的新字符串为 XXX 的扩展串,如字符串 XXXabcbcd\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_1A1B1B_1B1 具有相同的长度,那么我们定义字符串 A1A_1A1B1B_1B1 的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的 ASCII 码的差的绝对值,而空格字符与其他任意字符之间的距离为已知的定值K,空格字符与空格字符的距离为 000。在字符串 AAABBB 的所有扩展串中,必定存在两个等长的扩展串 A1A_1A1B1B_1B1,使得 A1A_1A1B1B_1B1 之间的距离达到最小,我们将这一距离定义为字符串 AAABBB 的距离。

请你写一个程序,求出字符串 AAABBB 的距离。

输入格式

输入文件第一行为字符串 AAA ,第二行为字符串 BBBAAABBB 均由小写字母组成且长度均不超过 200020002000。第三行为一个整数 K(1≤K≤100)K(1\leq K\leq 100)K(1K100),表示空格与其他字符的距离。

输出格式

输出文件仅一行包含一个整数,表示所求得字符串 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]=i
k;//初始化
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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值