来自:生物信息学-陈铭第二版的一个例题。

题目:

目前的代码,运行不正确,关键就是不知道怎么回溯啊,回溯怎么标记呢?

#include <iostream>
#include<vector>
using namespace std; vector<char> s1,t1;//在回溯的时候使用
string s,t;//输入两个字符串
int dp[][];
int maxs(int x,int y,int z){
if(x>=y&&x>=z)return x;
else if(y>=x&&y>=z)return y;
else return z;
}
void dfs(int len1,int len2){
//递归出口
if(len1==||len2==){//这里有一个问题就是另一个没放完怎么办?我要的是全部的。
//如果有一个其中没放完,那么接着放。
if(len1!=){//如果s1没放完那么
for(int i=len1-;i>=;i--){
s1.push_back(s[i]);
t1.push_back('-');
}
}
if(len2!=){
for(int i=len2-;i>=;i--){
s1.push_back('-');
t1.push_back(t[i]);
}
} //打印s1,t1。
for(int i=s1.size()-;i>=;i--)
cout<<s1[i]<<" ";
cout<<"\n";
for(int i=t1.size()-;i>=;i--)
cout<<t1[i]<<" ";
cout<<"\n\n";
return ;
} //先求出左上、上、下三者中最大的值
int m=maxs(dp[len1-][len2-],dp[len1-][len2],dp[len1][len2-]);
if(dp[len1-][len2-]==m){//如果这样的话,那么就将二者push进来
s1.push_back(s[len1-]);
t1.push_back(t[len2-]);
dfs(len1-,len2-);
s1.pop_back();t1.pop_back();
}
if(dp[len1-][len2]==m){
s1.push_back(s[len1-]);
t1.push_back('-');
dfs(len1-,len2);
s1.pop_back();t1.pop_back();
}
if(dp[len1][len2-]==m){
s1.push_back('-');
t1.push_back(t[len2-]);
dfs(len1,len2-);
s1.pop_back();t1.pop_back();
}
} int main() { cin>>s>>t;
int len1=s.size();
int len2=t.size();
int x,y,z;
for(int i=;i<=len1;i++){
for(int j=;j<=len2;j++){
if(i==&&j==){
dp[i][j]=;continue;
}
// if(i==0||j==0){//这么写是不对的,因为不知道是哪个插入了多少空格。
// dp[i][j]=-1;continue;
// }
if(i==){//相当于在s中一直插入-。
dp[i][j]=dp[i][j-]-;continue;
}
if(j==){
dp[i][j]=dp[i-][j]-;continue;
}
x=dp[i][j-]-;//在t中插入空格
y=dp[i-][j-]+(s[i-]==t[j-]?:-);//比较两者是否相同,相同+2,否则-1
z=dp[i-][j]-;//在s中插入空格
dp[i][j]=maxs(x,y,z);
}//在计算y时,一开始没有加上三元表达式的括号,导致计算错误。
}
//下面是怎么回溯找到解呢???
for(int i=;i<=len1;i++){
for(int j=;j<=len2;j++){
cout<<dp[i][j];
if(dp[i][j]<)cout<<" ";
else cout<<" ";
}
cout<<"\n";
}
dfs(len1,len2);
return ;
}
/**
acgctg
catgt
**/

目前的运行结果:

dp矩阵是正确的但是回溯结果不对,还是编程能力有限,先思考着,有解了再过来。

2020-3-14更新————————————

感觉自己那个时候就是个sb,脑子不清醒才学这些,有个p用。。。

生信-序列比较dp[未完成]的更多相关文章

  1. 生信-使用NCBI进行目的基因的引物设计

    使用NCBI进行目的基因的引物设计 全文概述 利用生信工具进行目的基因的引物设计,使用了NCBI进行筛选与设计引物,使用 idtdna对筛选出的DNA进行检查.本文分享了如何筛选出高质量的基因引物,帮 ...

  2. 生信工具汇总--OMICtools

    各种生信工具: https://omictools.com/

  3. 生信基础知识【04】GO和pathway分析

    非原创 参考资料: 一文掌握GO和pathway分析 - 生物信息学讨论版 -丁香园论坛http://www.dxy.cn/bbs/thread/34904124#34904124 GO富集 GO是G ...

  4. 生信软件的好帮手-bioconda--转载

    http://mp.weixin.qq.com/s/nK1Kkf9lfZStoX25Y7SzHQ 这篇文章主要适用于Linux平台,当然MacOS也行,不过它有更好安装方法. 此外网上也会许多更好的关 ...

  5. codevs 1962 马棚问题--序列型DP

    1962 马棚问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束 ...

  6. 精心整理(含图版)|你要的全拿走!(R数据分析,可视化,生信实战)

    本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/ZEjaxDifNATeV8fO4krOIQ更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. 为 ...

  7. 括号序列的dp问题模型

    括号序列的dp问题模型 Codeforces314E ◦给定一个长度为n的仅包含左括号和问号的字符串,将问号变成左括号或 右括号使得该括号序列合法,求方案总数. ◦例如(())与()()都是合法的括号 ...

  8. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

  9. 5.13 省选模拟赛 优雅的绽放吧,墨染樱花 多项式 prufer序列 计数 dp

    LINK:优雅的绽放吧,墨染樱花 当时考完只会50分的做法 最近做了某道题受到启发 故会做这道题目了.(末尾附30分 50分 100分code 看到度数容易想到prufer序列 考虑dp统计方案数. ...

随机推荐

  1. op bug 修复计划

    省-市-区-组-成员 多了一个组的下拉框,说不清它和区的联系 把它删掉,它的点击事件(把组的id和内容传给隐形的text,text通过ajax提交到数据库)给区下面的组

  2. 在函数体的“出口处”,对 return 语句的正确性和效率进行检查

    在函数体的“出口处”,对 return 语句的正确性和效率进行检查. 如果函数有返回值,那么函数的“出口处”是 return 语句. 我们不要轻视 return 语 句.如果 return 语句写得不 ...

  3. mongoose 数据库操作3

    Model.find(query, fields, options, callback) Model.find({ 'some.value': 5 }, function (err, docs) { ...

  4. SSH开发环境整合搭建

    1.建立动态web工程,加入必要的jar包. antlr-2.7.7.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar c3p0-0.9.1.2 ...

  5. C++之强制类型转换

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  6. Margin外边距叠加

    外边距(Margin)叠加 只有普通文档流中块级元素(块框)的垂直外边距才会发生外边距叠加.行内框.浮动框和绝对定位框之间的外边距不会叠加 两个相邻兄弟块框 父元素与子元素,并 父元素没有内边距或边框 ...

  7. 第十五篇:C程序的存储空间布局

    前言 C语言程序的执行必定需要耗费一定的资源,也就是说,程序在计算机内部的映像不可能就单单代码. 本文将讲解C语言程序在计算机内部的存在方式. 程序存储空间 1. 正文段:程序的机器指令部分 2. 初 ...

  8. oracle如何给指定用户修改密码?

    1.用system用户登录, 2.执行如下sql: alter user 用户名 identified by 新密码; 比如alter user scott identified by 123456; ...

  9. Code Forces 21C Stripe 2

    C. Stripe 2 time limit per test 1 second memory limit per test 64 megabytes input standard input out ...

  10. 2017-2018-2 20165330实验二《Java面向对象程序设计》实验报告

    实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 三种代码 伪代码:从意图层面来解 ...