OPENJUDGE NOI 2988 计算字符串距离
2016-10-27 16:39
316 查看
描述
对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:
修改一个字符(如把“a”替换为“b”)
删除一个字符(如把“traveling”变为“travelng”)
比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离。
给定任意两个字符串,写出一个算法来计算出他们的距离。
【题目分析】
动态规划。
【代码】
对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:
修改一个字符(如把“a”替换为“b”)
删除一个字符(如把“traveling”变为“travelng”)
比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离。
给定任意两个字符串,写出一个算法来计算出他们的距离。
【题目分析】
动态规划。
【代码】
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; char s1[1001],s2[1001]; int l1,l2,t; int f[1001][1001]; int main() { scanf("%d",&t); while (t--) { memset(f,0,sizeof f); scanf("%s",s1+1); scanf("%s",s2+1); l1=strlen(s1+1); l2=strlen(s2+1); for (int i=1;i<=l1;++i) f[i][0]=i; for (int i=1;i<=l2;++i) f[0][i]=i; for (int i=1;i<=l1;++i) for (int j=1;j<=l2;++j) if (s1[i]==s2[j]) f[i][j]=f[i-1][j-1]; else f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j]))+1; printf("%d\n",f[l1][l2]); } }
相关文章推荐
- openjudge 计算概论 字符串1:统计字符数
- |NOIOJ|动态规划|2988:计算字符串距离
- openjudge 计算概论 字符串 3:过滤多余的空格
- openjudge 计算概论 字符串6:字符串最大跨距
- 【计算连乘积中末尾0的个数】OpenJudge NOI 7657:连乘积末尾0的个数
- Openjudge NOI题库1.7编程基础之字符串 34:回文子串
- 2988:计算字符串距离
- OpenJudge计算概论-忽略大小写比较字符串大小
- OpenJudge计算概论-字符串排序
- NOIOpenjudge 1.13--08特殊日历计算
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35
- openjudge 计算概论 字符串 5:单词排序
- openjudge 计算概论 字符串 2:单词倒排
- OpenJudge-计算点的距离并排序
- 2988:计算字符串距离(2.6基本算法之动态规划)
- OpenJudge计算概论-发票统计
- OpenJudge计算概论-自整除数
- OpenJudge计算概论-与7无关的数
- OpenJudge计算概论-四大湖
- OpenJudge计算概论-奇数求和