华为-2023C-两个字符串间的最短路径(dp)
https://oj.algomooc.com/problem.php?id=3397
给定两个字符串,分别为字符串\(A\)与字符串\(B\)。
例如\(A\)字符串为\(ABCABBA\),\(B\)字符串为\(CBABAC\),可以得到下图\(m*n\)的二维数组,定义原点为\((0,0)\),终点为\((m,n)\),水平与垂直的每一条边距离为\(1\),映射成坐标系如下图。
从原点\((0,0)\)到\((0,A)\)为水平边,距离为\(1\),从\((0,A)\)到\((A,C)\)为垂直边,距离为\(1\);假设两个字符串同一位置的两个字符相同则可以作一个斜边,如\((A,C)\)到\((B,B)\)最短距离为斜边,距离同样为1。出所有的斜边如下图,\((0,0)\)到\((B,B)\)的距离为 1个水平边+ 1个垂直边+ 1个斜边=3。
根据定义可知,原点到终点的最短距离路径如下图红线标记,最短距离为9
输入
空格分割的两个字符串A与字符串B,字符串不为空串,字符格式满足正则规则:\([A-Z]\),字符串长度<=10000
输出
原点到终点的最短距离
样例输入 复制
ABC ABC
样例输出 复制
3
这个题wa了两发,因为这题他是从(0,0)出发的,就是第0排没有字符,也要从第(0,0)开始
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e3+100;
char a[maxn];
char b[maxn];
int dp[maxn][maxn];
int main(){
scanf("%s",a+1);
scanf("%s",b+1);
int lena=strlen(a+1);
int lenb=strlen(b+1);
memset(dp,0x3f3f3f3f,sizeof(dp));
dp[0][0]=0;
for(int i=0;i<=lena;i++){
for(int j=0;j<=lenb;j++){
if(i==0&&j==0) {
dp[i][j]=0;
continue;
}
else if(i==0){
dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
continue;
}
else if(j==0){
dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
continue;
}
else dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1;
if(a[i]==b[j]){
dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);
}
}
}
cout<<dp[lena][lenb]<<endl;
}