【洛谷】P1279 字串距离
洛谷 距离 字串
2023-09-14 09:13:20 时间
【洛谷】P1279 字串距离
1.题意
- 可以在一个字符串的任意位置插入若干个空格
- 定义两个字符的值的构成法则
- 求出两个字符串的距离值
2.分析
- 简单的dp题
- 状态转移公式:
dp[i][j] = min(dp[i-1][j]+k,//a[i]和空格匹配
dp[i][j-1]+k,//空格和b[j]匹配
dp[i-1][j-1]+val);//二者直接匹配加上差值
- 需要注意初始化,否则会得到错误的结果
3.代码
#include <cstring>
#include<iostream>
using namespace std;
const int maxN = 2e3+5;
int dp[maxN][maxN];//dp[i][j]表示子串a[i]与b[j]可达到的最小值
char a[maxN], b[maxN];//两个字符串
int k; //空格和字符之间的固定差值
int getMin(int a,int b ,int c){
if(a >= b )
if(b >= c) return c;
else return b;
else
if(a >= c) return c;
else return a;
}
int main(){
scanf("%s",a+1);
scanf("%s",b+1);
cin >> k;
int lA = strlen(a+1), lB = strlen(b+1);
//step1:初始化
for(int i = 1;i<=lA;i++){
dp[i][0] = dp[i-1][0] + k;//a串与空串进行匹配
dp[0][i] = dp[0][i-1] + k;//空串与b串进行匹配
}
//step2: 开始递推就算最优解
for(int i = 1;i<= lA ;i++){
for(int j = 1;j<= lB;j++){
int val = abs(int(a[i]) - int(b[j]));
dp[i][j] = getMin(dp[i-1][j]+k,//a[i]和空格匹配
dp[i][j-1]+k,//空格和b[j]匹配
dp[i-1][j-1]+val);//二者直接匹配加上差值
}
}
cout << dp[lA][lB] <<"\n";
}
4.测试用例
cmc
snmn
2
c
c
2
c
s
2
cmc
cmcs
2
相关文章
- 洛谷P1331 海战 题解
- 洛谷 P3419 [POI2005]SAM-Toy Cars题解
- 洛谷 P1992 不想兜圈的老爷爷 题解
- 洛谷-最长公共子串「建议收藏」
- 洛谷P1996 约瑟夫问题 c++链表做法
- 如何在洛谷写博客
- 【day1】【洛谷算法题】-B2002Hello,World-刷题反思集[入门1顺序结构]
- 【题解】洛谷P1003铺地毯
- 洛谷CF1744A题解
- 洛谷P1048
- 洛谷P1143
- 【洛谷-图论】P1807 最长路
- 【洛谷-拓扑排序】P4017 最大食物链计数
- 【洛谷习题】P5318 【深基18.例3】查找文献
- 【洛谷习题】P1255 数楼梯
- 【括号匹配&洛谷&进制转换】栈的实战,包教包会
- 洛谷CF1759B题解
- 洛谷-3月月赛2-Div.2