有兴趣可进来计论此算法?

hcy8004 2002-05-28 01:58:22
有兴趣可进来计论此算法?
原题如下:
“最近出现了一种奇异的生物病毒,这种病毒侵染的范围很广。科学家们经研究发现,这种病毒的内部存在一环状DNA片段,而正常情况下,生物的基因总是呈线状排列的。
因此据Dr.X推测,病毒侵染某个生物的几率可能正是与此有关:被侵染生物的DNA中总是或多或少地存在着一些片段,它们与环状DNA片段中的一部分是相同的(可称之为“匹配”),而它们中最长的片段被侵染的可能性就越大。其后又有研究发现,某些生物被侵染的几率远大于其它生物,对此Dr.X推测,可能是因为环状DNA片段不仅可以部分地匹配被侵染生物的DNA片段,还可以循环地匹配。
例如如果环状DNA片段为abc(也可以表示为bca或是cab,但它和acb是不同的),被侵染生物的DNA为abbcabcabb,那么能被环状DNA片段匹配的最长片段就是bcabcab,那么能被环状DNA片段匹配的最长片段就是bcabcab,长度为7.
面对大量的实验数据,Dr.X希望你能够帮她设计一个程序,计算出被侵染生物的DNA中与环状DNA片段匹配的最长片段的长度。”
最好具体点。
...全文
57 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
whb790824 2002-05-30
  • 打赏
  • 举报
回复
不能编译通过
wanbaocheng 2002-05-30
  • 打赏
  • 举报
回复
同意!!!
xf8zbf 2002-05-30
  • 打赏
  • 举报
回复
说明真是少
这就是国人的程序
one_add_one 2002-05-30
  • 打赏
  • 举报
回复
这个程序是那期擂台赛擂主的程序。
one_add_one 2002-05-30
  • 打赏
  • 举报
回复
这个程序是那期擂台赛擂主的程序。
xiaoluoli 2002-05-30
  • 打赏
  • 举报
回复
/*VC6编译通过*/
#include <stdio.h>
#include <stdlib.h>

char v[1000],*k;
long max=0;
int n,w[128][1000],wl[128];

void slove(int l,int h){ /*动态规划求解*///////////无返回值
long a1[1000],b1[1000],*a=a1,*b=b1,*c,i,j,ma;
int t;
for (i=0;i<n;i++){
a1[i]=0;b1[i]=0;
}
t=k[l];
for (i=0;i<wl[t];i++)
a[w[t][i]]=1;
for (j=l+1;j<=h;j++){
t=k[j];ma=0;
for (i=0;i<wl[t];i++){
if (w[t][i]>0) b[w[t][i]]=a[w[t][i]-1]+1;
else b[w[t][i]]=a[n-1]+1;
if (ma<b[w[t][i]]) ma=b[w[t][i]];
}
if (max<ma) max=ma;
if (ma+h-j<=max) break;
t=k[j-1];
for (i=0;i<wl[t];i++)
a[w[t][i]]=0;
c=a;a=b;b=c;
}
}

int main()
{
FILE *fp;
int c[128][128],t=0,x=0;
long m,i,j,low=-1;
if ((fp=fopen("virus.in","r"))==NULL) exit(1); /*读入数据*/
fscanf(fp,"%d%s%ld",&n,v,&m);
if ((k=(char*)malloc(m+1))==NULL) exit(1);
//malloc应该是返回char*型的指针,但VC要加(char*)才能通过
fscanf(fp,"%s",k);
if (n==1){/*初始化数据*/
v[1]=v[0];v[2]='\0';n=2;
}
for (i=0;i<128;i++)
for (j=0;j<128;j++)
c[i][j]=0;
for (i=1;i<n;i++)
if (c[v[i-1]][v[i]]++==0) t++;
if (c[v[n-1]][v[0]]++==0) t++;
if (t<=2) n=2;
for (i=0;i<n;i++)
w[v[i]][wl[v[i]]++]=i;
for (i=0;i<m;i++) /*搜索剪枝*/
if (c[k[i]][k[i+1]]>0){
if (low==-1) low=i;
if (x==0) x=k[i];
else if (x>0 && x!=k[i]) x=-1;
}
else{
if (low!=-1){
if (x>0 && low<i-n && t>1) low=i-n;
if (max<=i-low)
slove(low,i);
low=-1;x=0;
}
}
if (max==0)
for (i=0;i<m;i++)
if (wl[k[i]]>0){
max=1;
break;
}
fp=fopen("virus.out","w"); /*输出结果*/
fprintf(fp,"%ld",max);
fclose(fp);
free(k);
return 0;
}
//指出点小问题
深水蔚蓝 2002-05-29
  • 打赏
  • 举报
回复
这是前年的全国大学生数学建模的题目。

可以看看去年的《数学的实践与认识》有
深水蔚蓝 2002-05-29
  • 打赏
  • 举报
回复
编译不通过
one_add_one 2002-05-29
  • 打赏
  • 举报
回复
/*VC6编译通过*/
#include <stdio.h>
#include <stdlib.h>

char v[1000],*k;
long max=0;
int n,w[128][1000],wl[128];

slove(int l,int h){ /*动态规划求解*/
long a1[1000],b1[1000],*a=a1,*b=b1,*c,i,j,ma;
int t;
for (i=0;i<n;i++){
a1[i]=0;b1[i]=0;
}
t=k[l];
for (i=0;i<wl[t];i++)
a[w[t][i]]=1;
for (j=l+1;j<=h;j++){
t=k[j];ma=0;
for (i=0;i<wl[t];i++){
if (w[t][i]>0) b[w[t][i]]=a[w[t][i]-1]+1;
else b[w[t][i]]=a[n-1]+1;
if (ma<b[w[t][i]]) ma=b[w[t][i]];
}
if (max<ma) max=ma;
if (ma+h-j<=max) break;
t=k[j-1];
for (i=0;i<wl[t];i++)
a[w[t][i]]=0;
c=a;a=b;b=c;
}
}

int main()
{
FILE *fp;
int c[128][128],t=0,x=0;
long m,i,j,low=-1;
if ((fp=fopen("virus.in","r"))==NULL) exit(1); /*读入数据*/
fscanf(fp,"%d%s%ld",&n,v,&m);
if ((k=malloc(m+1))==NULL) exit(1);
fscanf(fp,"%s",k);
if (n==1){/*初始化数据*/
v[1]=v[0];v[2]='\0';n=2;
}
for (i=0;i<128;i++)
for (j=0;j<128;j++)
c[i][j]=0;
for (i=1;i<n;i++)
if (c[v[i-1]][v[i]]++==0) t++;
if (c[v[n-1]][v[0]]++==0) t++;
if (t<=2) n=2;
for (i=0;i<n;i++)
w[v[i]][wl[v[i]]++]=i;
for (i=0;i<m;i++) /*搜索剪枝*/
if (c[k[i]][k[i+1]]>0){
if (low==-1) low=i;
if (x==0) x=k[i];
else if (x>0 && x!=k[i]) x=-1;
}
else{
if (low!=-1){
if (x>0 && low<i-n && t>1) low=i-n;
if (max<=i-low)
slove(low,i);
low=-1;x=0;
}
}
if (max==0)
for (i=0;i<m;i++)
if (wl[k[i]]>0){
max=1;
break;
}
fp=fopen("virus.out","w"); /*输出结果*/
fprintf(fp,"%ld",max);
fclose(fp);
free(k);
return 0;
}
one_add_one 2002-05-29
  • 打赏
  • 举报
回复
这个题如果用KMP会死翘翘的。

标准解法是动态规划。
rainbowcn 2002-05-29
  • 打赏
  • 举报
回复
是啊,KMP字符串的模式匹配算法早就存在了。太多的书中都有该算法的描述。
flyaramy 2002-05-29
  • 打赏
  • 举报
回复
2000年数摩竞赛题·或奖、论文在2001年《数学的实践与认识》第一期!
starfish 2002-05-29
  • 打赏
  • 举报
回复
老题目了
动态规划就可以搞定
radioheads 2002-05-29
  • 打赏
  • 举报
回复
去年程序员第十期,有海星的详细解答
qiangqiang1112 2002-05-29
  • 打赏
  • 举报
回复
不用模式匹配,只用动态规划怎么行?????????
one_add_one 2002-05-29
  • 打赏
  • 举报
回复
to mrunix(脸上有豆豆的...Mr.Unix)
没看清楚题目不要乱说。
前年的数学建模是DNA分类,可以用神经网络做。

这个题目是DNA的匹配。


BTW,我的程序没有问题。
superzjx2000 2002-05-28
  • 打赏
  • 举报
回复
KMP字符串的模式匹配算法 这个算法已经存在很久了 随便找都有
<<数据结构>>
清华大学 严蔚敏

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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