字符串比较问题(动态规划)

slovey 2007-11-04 08:14:39
字符串比较问题
1.问题描述:
对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距离为一定值k。
在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A 和B 的所有长度相同的扩展中,有一对距离最小的扩展,该距离称为字符串A和B的扩展距离。
对于给定的字符串A和B,试设计一个算法,计算其扩展距离。
2.编程任务:
对于给定的字符串A和B,编程计算其扩展距离。
3.数据输入:
由文件input.txt给出输入数据。第1 行是字符串A;第2 行是字符串B。第3行是空格与其它字符的距离定值k。
4.结果输出:
将计算出的字符串A和B的扩展距离输出到文件output.txt。
输入文件示例 输出文件示例
input.txt output.txt
cmc 10
snmn
2
...全文
818 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
slovey 2007-12-05
  • 打赏
  • 举报
回复
//测试数据
//cmc
//snmn
//2
#include<iostream>
#include<fstream>
#include<stdio.h>
#define MAXINT 1000//足够大的一个整数
using namespace std;
int dist(char a,char b,int &k)
{
if(b==' '||a==' ')
return k;
else
{
return abs(int(b-a));

}
}
int comp(char str1[],char str2[],int k)
{
int val[100][100];
int i,j,tmp,len1,len2;
val[0][0]=0;
len1=strlen(str1);
len2=strlen(str2);
for(i=0;i<=len1;i++)
for(j=0;j<=len2;j++)
if(i+j){
val[i][j]=MAXINT;
if(((i*j))&&(tmp=val[i-1][j-1]+dist(str1[i-1],str2[j-1],k))<val[i][j])
val[i][j]=tmp;
//cout<<"一"<<dist(str1[i-1],str2[j-1],k)<<endl;
if((i)&&(tmp=val[i-1][j]+dist(str1[i-1],' ',k))<val[i][j])
val[i][j]=tmp;
//cout<<"二"<<dist(str1[i-1],' ',k)<<endl;
if((j)&&(tmp=val[i][j-1]+dist(' ',str2[j-1],k))<val[i][j])
val[i][j]=tmp;
//cout<<"三"<<dist(' ',str2[j-1],k)<<endl;
}
return val[len1][len2];
}

void main()
{
ifstream fin("qingsongin.txt");
ofstream fout("qingsongout.txt");
if(!fin)
{
cout<<"ERROR!"<<endl;
}
if(!fout)
{
cout<<"ERROR!"<<endl;
}
char str1[100];
char str2[100];
/*
for(int i=0;i<3;i++)
fin>>str1[i];
str1[i]='\0';
for(int j=0;j<4;j++)
fin>>str2[j];
str2[j]='\0';
//puts(str1);
//puts(str2);
*/
fin.getline(str1,100);//读一整行
fin.getline(str2,100);
int k;
fin>>k;
//cout<<k<<endl;
//char str1[100];
///char str2[100];
//cout<<"请输入字符串str1:"<<endl;
//gets(str1);
//cout<<"请输入字符串str2:"<<endl;
//gets(str2);
//cout<<"输入特定的k"<<endl;
//int k;
//cin>>k;
//cout<<"其扩展距离是:"<<endl;
//cout<<comp(str1,str2,k)<<endl;
fout<<"其扩展距离是:"<<endl;
fout<<comp(str1,str2,k)<<endl;
//cout<<dist(' ','a',k)<<endl;//测试dist函数,结果应该为2
//cout<<dist('a','f',k)<<endl;//测试dist函数,结果应该为5
cout<<"程序运行成功!"<<endl;
cout<<"请查看qingsongout.txt"<<endl;
}
slovey 2007-11-07
  • 打赏
  • 举报
回复
四楼的算法很正确...
支持...
slovey 2007-11-05
  • 打赏
  • 举报
回复
加油.
努力中....
jiaqiangscut00 2007-11-04
  • 打赏
  • 举报
回复
忘得差不多了
simulationz 2007-11-04
  • 打赏
  • 举报
回复
该问题的答案如下(未调适):
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <string.h>

#define MAX_STR 100
main()
{
FILE* fpin, fpout;
char cha[MAX_STR],chb[MAX_STR];
int i,k;
int len,alen,blen;
int distance;

fpin = fopen("input.txt","r+");
fpout = fopen("output.txt","w");
if(fpin==-1 || fpout == -1)
{
printf("open file error!\n");
return 0;
}

cha[0] = '\0';
chb[0] = '\0';
k = 0;
fgets(fpin,cha);
fgets(fpin,chb);
fscanf(fpin,"%d",&k);

distance=0;
len=(alen <= blen? alen: blen);
for(i = 0; i<len;i++)
{
if(cha[i]!=' '&& chb[i] != ' ')
{
distance +=abs(cha[i]-chb[i]);
}
else
{
if(cha[i] == ' '|| chb[i] == ' ')
{
distance+=k;
}
}
}
distance += k*abs(alen-blen);

fputs(fpout,itoa(distance));
fclose(fpin);
fclose(fpout);
return 0;
}
C1053710211 2007-11-04
  • 打赏
  • 举报
回复
对于一个字符串A,设它是A1,A2,A3,A4,....,Ai,....,An
对于一个字符串B,设它是B1,B2,B3,B4,....,Bj,....,Bn
用d[i][j]表示两个子串的最优值,有状态转移方程
d[i][j]=min{d[i][j-1]+空格与其它字符的距离为一定值k,d[i-1][j]+k,d[i-1][j-1]+两个字符的差}
飞哥 2007-11-04
  • 打赏
  • 举报
回复
就怕看字
终于又吧professional c++看了一遍好累
scorpio16 2007-11-04
  • 打赏
  • 举报
回复
楼上的算法有点问题。
题目说“字符串A的扩展是在A中插入若干空格字符所产生的字符串”,不一定是放在最后,我觉得应该可以在字符串中间插入,否则这个题目也太简单点了。

还没有思路,动态规划不熟,我得先看看书温习温习。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧