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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【DP】Bovine Genetics G(P7152)

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【DP】Bovine Genetics G(P7152) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

P7152


題目大意

對于一個原串(只有四種字符),先將所有相鄰且相同的字符分割開,對分割得到的若干段翻轉,得到編輯后的字符串,現在給出編輯后的字符串(有一些位置不確定),問你有多少種符合的原串


解題思路

對于一個編輯后的字符串,考慮對其進行分割,那么分割合法要滿足以下兩個條件:

  • 每一段中相鄰位置不相同(如果相同,那么對于原串肯定會再分割)
  • 對于相鄰兩段a,b,a的首字符要和b的結尾字符相同(保證在原串中可以被分割)
  • 可以考慮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相同即可)

    那么對于新插入的一個字符考慮兩種方案:

  • 加入最后一段里,那么要保證新字符和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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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