DNA repair - HDU 2457(自动机+dp)
生活随笔
收集整理的這篇文章主要介紹了
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codevs 1021 玛丽卡
- 下一篇: 危险的文件夹上传框