1. 程式人生 > >生信-序列比較dp[未完成]

生信-序列比較dp[未完成]

\n aps hid urn info 能力 輸入 分享 開始

來自:生物信息學-陳銘第二版的一個例題。

題目:

技術分享圖片

技術分享圖片

技術分享圖片

目前的代碼,運行不正確,關鍵就是不知道怎麽回溯啊,回溯怎麽標記呢?

技術分享圖片
#include <iostream>
#include<vector>
using namespace std;

vector<char> s1,t1;//在回溯的時候使用
string s,t;//輸入兩個字符串
int dp[30][30];
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==0||len2==0){//這裏有一個問題就是另一個沒放完怎麽辦?我要的是全部的。 //如果有一個其中沒放完,那麽接著放。 if(len1!=0){//如果s1沒放完那麽 for(int i=len1-1;i>=0;i--){ s1.push_back(s[i]); t1.push_back(-); } }
if(len2!=0){ for(int i=len2-1;i>=0;i--){ s1.push_back(-); t1.push_back(t[i]); } } //打印s1,t1。 for(int i=s1.size()-1;i>=0;i--) cout<<s1[i]<<" "; cout<<"\n"; for(int i=t1.size()-1
;i>=0;i--) cout<<t1[i]<<" "; cout<<"\n\n"; return ; } //先求出左上、上、下三者中最大的值 int m=maxs(dp[len1-1][len2-1],dp[len1-1][len2],dp[len1][len2-1]); if(dp[len1-1][len2-1]==m){//如果這樣的話,那麽就將二者push進來 s1.push_back(s[len1-1]); t1.push_back(t[len2-1]); dfs(len1-1,len2-1); s1.pop_back();t1.pop_back(); } if(dp[len1-1][len2]==m){ s1.push_back(s[len1-1]); t1.push_back(-); dfs(len1-1,len2); s1.pop_back();t1.pop_back(); } if(dp[len1][len2-1]==m){ s1.push_back(-); t1.push_back(t[len2-1]); dfs(len1,len2-1); 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=0;i<=len1;i++){ for(int j=0;j<=len2;j++){ if(i==0&&j==0){ dp[i][j]=0;continue; } // if(i==0||j==0){//這麽寫是不對的,因為不知道是哪個插入了多少空格。 // dp[i][j]=-1;continue; // } if(i==0){//相當於在s中一直插入-。 dp[i][j]=dp[i][j-1]-1;continue; } if(j==0){ dp[i][j]=dp[i-1][j]-1;continue; } x=dp[i][j-1]-1;//在t中插入空格 y=dp[i-1][j-1]+(s[i-1]==t[j-1]?2:-1);//比較兩者是否相同,相同+2,否則-1 z=dp[i-1][j]-1;//在s中插入空格 dp[i][j]=maxs(x,y,z); }//在計算y時,一開始沒有加上三元表達式的括號,導致計算錯誤。 } //下面是怎麽回溯找到解呢??? for(int i=0;i<=len1;i++){ for(int j=0;j<=len2;j++){ cout<<dp[i][j]; if(dp[i][j]<0)cout<<" "; else cout<<" "; } cout<<"\n"; } dfs(len1,len2); return 0; } /** acgctg catgt **/
View Code

目前的運行結果:

技術分享圖片

dp矩陣是正確的但是回溯結果不對,還是編程能力有限,先思考著,有解了再過來。

生信-序列比較dp[未完成]