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

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片段匹配的最长片段的长度。”
最好具体点。
...全文
103 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字符串的模式匹配算法 这个算法已经存在很久了 随便找都有
<<数据结构>>
清华大学 严蔚敏
摘 要 针对高校教师教学业绩管理流程复杂、数据填报不规范、多级审核效率低、统计分析滞后等问题,本文设计并实现一套基于SpringBoot+Vue前后端分离架构的高校教师教学业绩综合管理系统。系统后端以SpringBoot处理业务逻辑与接口开发,前端用Vue构建交互界面,MySQL存储数据,MD5加密保障账号安全,具备低耦合、易扩展、易维护特性。 系统按权限划分为教师、学院管理员、学校管理员三级角色,构建闭环式业绩管理体系。教师可完成信息维护、业绩录入、成果申报、审核跟踪、档案导出、智能咨询与社区互动;学院管理员负责教师管理、业绩初审、数据汇总、通知发布与修正申请;学校管理员承担权限分配、数据维护、业绩终审、统计分析、公告发布与日志审计。 系统实现业绩填报、初审、终审、统计归档全流程线上化,支持批量导入、敏感词过滤、数据可视化、7×24小时AI咨询等功能,规范管理流程、减少统计误差、提升审核效率。测试表明,系统满足高校教学业绩精细化、规范化、信息化管理需求,为教师考核、绩效评定、教学评估提供数据支撑,提升高校教学管理智能化水平。 关键词: SpringBoot;Vue;教学业绩管理;三级权限;前后端分离
内容概要:本文围绕“基于雅可比伪逆迭代的双臂协同轨迹规划与跟踪误差收敛性研究”展开,通过Matlab代码实现双机械臂系统的协同运动控制与轨迹跟踪。研究采用雅可比伪逆法求解冗余机械臂的逆运动学问题,实现末端执行器在笛卡尔空间中的精确轨迹规划,并引入迭代优化机制提升双臂协同作业的精度与稳定性。重点分析了轨迹跟踪过程中误差的收敛特性,验证了所提控制算法在多自由度强耦合系统中的有效性和鲁棒性,适用于复杂环境下需要高精度配合的机器人协同操作任务。该研究属于科研仿真复现类工作,融合了机器人运动学理论、数值计算方法与控制算法设计,为多机械臂系统提供了可行的轨迹规划与控制策略参考。; 适合人群:具备扎实的机器人学基础、自动控制理论知识以及良好Matlab编程能力的科研人员或研究生,尤其适合从事多机械臂协同控制、运动规划、逆运动学求解及误差分析等方向的研究者。; 使用场景及目标:①用于多机械臂系统的协同轨迹规划与运动控制算法研究;②深入理解基于雅可比伪逆法的逆运动学求解原理及其在冗余机构中的应用;③分析轨迹跟踪误差的收敛行为,评估控制策略的稳定性与精度;④作为高质量论文复现资源,支撑相关课题的仿真验证、算法对比与改进创新。; 阅读建议:建议结合Matlab代码与机器人运动学经典理论同步学习,重点关注雅可比矩阵的构建、伪逆运算的实现方式、误差反馈机制的设计以及迭代过程中的数值稳定性处理,同时可进一步拓展至非线性优化、避免奇异位形及实时控制策略的改进研究。

33,026

社区成员

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

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