【DP】Bovine Genetics G(P7152)
生活随笔
收集整理的這篇文章主要介紹了
【DP】Bovine Genetics G(P7152)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
P7152
題目大意
對于一個原串(只有四種字符),先將所有相鄰且相同的字符分割開,對分割得到的若干段翻轉,得到編輯后的字符串,現在給出編輯后的字符串(有一些位置不確定),問你有多少種符合的原串
解題思路
對于一個編輯后的字符串,考慮對其進行分割,那么分割合法要滿足以下兩個條件:
可以考慮DP,設fi,chf_{i,ch}fi,ch?為前i個字符已經分割好,且最后一段的首字符為ch的方案數,那么可以從i往后枚舉,然后傳遞
但這樣顯然會TLE,題目有說到字符串只有四種字符,那么可以考慮從字符下手
設fi,a,b,cf_{i,a,b,c}fi,a,b,c?為前i個字符串已經分割好了,且上一段首字符為a,當前段首字符為b,結尾字符為c的方案數(計算答案的時候保證a,c相同即可)
那么對于新插入的一個字符考慮兩種方案:
這樣轉移時間復雜度為O(n),常數為444^444,可以過
code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 100010 #define wyc 1000000007 using namespace std; int n,ans,v[N],f[N][5][5][5]; char c[N]; int main() {scanf("%s",c+1);n=strlen(c+1);for(int i=1;i<=n;++i){if(c[i]=='?')v[i]=0;else if(c[i]=='A')v[i]=1;else if(c[i]=='C')v[i]=2;else if(c[i]=='G')v[i]=3;else v[i]=4;}for(int i=1;i<=4;++i)for(int j=1;j<=4;++j)if(v[1]==j||!v[1])f[1][i][j][j]=1;for(int i=1;i<n;++i)for(int c=1;c<=4;++c)if(!v[i]||v[i]==c)for(int a=1;a<=4;++a)for(int b=1;b<=4;++b){if(!v[i+1]){for(int d=1;d<=4;++d){//?的情況if(a==c)(f[i+1][b][d][d]+=f[i][a][b][c])%=wyc;if(c!=d)(f[i+1][a][b][d]+=f[i][a][b][c])%=wyc;}}else{if(a==c)(f[i+1][b][v[i+1]][v[i+1]]+=f[i][a][b][c])%=wyc;if(c!=v[i+1])(f[i+1][a][b][v[i+1]]+=f[i][a][b][c])%=wyc;}}for(int a=1;a<=4;++a)for(int b=1;b<=4;++b)(ans+=f[n][a][b][a])%=wyc;printf("%d",ans);return 0; }總結
以上是生活随笔為你收集整理的【DP】Bovine Genetics G(P7152)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【bfs】Replication G(P
- 下一篇: 【图论】Tree之最小方差树(bzoj