日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DNA repair - HDU 2457(自动机+dp)

發布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DNA repair - HDU 2457(自动机+dp) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意:給你N個DNA的串,也就是至包含'A','T','G','C'四種堿基的,這些給定的串都是帶有遺傳病的,然后給你一個不會超過1000的串,問你至少幾個地方才能讓這個串不包含遺傳病,如果不論怎么修改都沒用,輸出'-1'

?

分析:用dp[Ni][nNode],表示長度為i時候到達第n個節點修改的最小次數,然后統計最后一層次最小次數就行了。

?

代碼如下:

=============================================================================================================================

#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<queue> using namespace std;const int MAXN = 1007; const int MAXM = 57; const int MaxSon = 4; const int oo = 1e9+7;int dp[MAXN][MAXN];struct Ac_Trie {int next[MAXN][MaxSon];int Fail[MAXN], End[MAXN];int cnt, root;int newnode(){for(int i=0; i<MaxSon; i++)next[cnt][i] = -1;Fail[cnt] = End[cnt] = false;return cnt++;}void InIt(){cnt = 0;root = newnode();}int Find(char ch){if(ch == 'A')return 0;if(ch == 'T')return 1;if(ch == 'G')return 2;return 3;}void Insert(char s[]){int now = root;for(int i=0; s[i]; i++){int k = Find(s[i]);if(next[now][k] == -1)next[now][k] = newnode();now = next[now][k];}End[now] = true;}void GetFial(){queue<int>Q;int now = root;for(int i=0; i<MaxSon; i++){if(next[now][i] == -1)next[now][i] = root;else{Fail[next[now][i]] = root;Q.push(next[now][i]);}}while(Q.size()){now = Q.front();Q.pop();for(int i=0; i<MaxSon; i++){if(next[now][i] == -1)next[now][i] = next[Fail[now]][i];else{Fail[next[now][i]] = next[Fail[now]][i];Q.push(next[now][i]);}}End[now] |= End[Fail[now]];}} }; Ac_Trie ac;int main() {int N, t=1;while(scanf("%d", &N), N){char s[MAXN];ac.InIt();for(int i=0; i<N; i++){scanf("%s", s);ac.Insert(s);}ac.GetFial();scanf("%s", s+1);N = strlen(s);for(int i=0; i<=N; i++)for(int j=0; j<ac.cnt; j++)dp[i][j] = oo;dp[0][0] = 0;for(int i=0; i<N-1; i++)for(int j=0; j<ac.cnt; j++)for(int k=0; k<4; k++){int w = dp[i][j];int next = ac.next[j][k];if(ac.End[next])continue;if(ac.Find(s[i+1]) != k)w++;if(dp[i+1][next] > w)dp[i+1][next] = w;}int Min = oo;for(int i=0; i<ac.cnt; i++)Min = min(Min, dp[N-1][i]);if(Min == oo)Min = -1;printf("Case %d: %d\n", t++, Min);}return 0; }

?

轉載于:https://www.cnblogs.com/liuxin13/p/4760287.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的DNA repair - HDU 2457(自动机+dp)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。