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

题目:

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

#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用。。。

最新文章

  1. 转载 CSS3 经典教程系列:CSS3 盒阴影(box-shadow)详解
  2. 【Android】命令行jarsigner签字和解决找不到证书链错误
  3. 【腾讯bugly干货】QQ空间直播秒开优化实践
  4. Hibernate关联映射(转载)
  5. Winform自定义窗体样式,实现标题栏可灵活自定义
  6. 2016 Multi-University Training Contest 7
  7. 关于MFC库和CRT库冲突的分析
  8. 《Python 学习手册4th》 第八章 列表与字典
  9. div+css的兼容性问题和解决方法
  10. sync fsync fdatasync ---systemtap跟踪
  11. Util
  12. Hibernate 系列教程1-枚举单例类
  13. POJ - 3061 Subsequence(连续子序列和&gt;=s的最短子序列长度)
  14. Python 判断是否为质数或素数
  15. 大数据 --&gt; 分布式服务框架Zookeeper
  16. go优化
  17. shell脚本获取进程ID并杀死的实现及问题解析
  18. ssh 免密登录
  19. Unity ---WidgetsUI CreateTileView Demo
  20. [WARNING]: Could not match supplied host pattern, ignoring: servers

热门文章

  1. C++ 引用做左值
  2. JDBC中,用于表示数据库连接的对象是。(选择1项)
  3. malloc 返回值的类型是 void *
  4. 【BZOJ】1016: [JSOI2008]最小生成树计数(kruskal+特殊的技巧)
  5. Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)
  6. [转]Shell脚本中获取SELECT结果值的方法
  7. 【转】Native Thread for Win32 A- Create Thread(通俗易懂,非常好)
  8. Gradle -- buildScript块与allprojects块及根级别的repositories区别
  9. 多线程下的神奇的IOCP
  10. HDU 2159 FATE(二维全然背包)