标签:dp
Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)2014 Multi-University Training Contest 4
题目大意
给定DNA序列长度m和一个DNA(每单位DNA有AGCT 4种可能)片段,求所有和所给序列最长公共子串长度为0~len的DNA数量
解题思路
在开题的时候以为是数论+组合数学,思路越想越偏……
后来CLJ给出超简要的题解……
听别人的一种按位压缩的思路,就是枚举到该位置之时LCS所对应的位置,若一一对应则该位为1,否则为0
而当我们要处理新的单位DNA时就有一个变换LCS对应的会改变。
则我们枚举所有可能的匹配位置并枚举下一位,算出下一个状态对应的LCS所在位置,按位压缩。
当我们处理长度为m的DNA是就可以直接带入了。
因为m<=1000dp状态采用滚动数组存储
code:
#include <cstdio> #include <iostream> #include <algorithm> #include <ctime> #include <cctype> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> #define sqr(x) ((x)*(x)) #define LL long long #define INF 0x3f3f3f3f #define PI acos(-1.0) #define eps 1e-10 #define mod 1000000007 using namespace std; int bitc(int x)//计算LCS长度 { int ans=0; while (x) { ans+=x%2; x/=2; } return ans; } int dp[2][(1<<16)+10]; int to[(1<<16)+10][4]; int bt[20]; int go[20]; int ma[20]; int t[20]; char l[5]="ACGT"; char s[100]; int main() { int T,n,m; scanf("%d",&T); while (T--) { scanf("%s",s); n=strlen(s); scanf("%d",&m); for (int i=0;i<(1<<(n+1));i++) { bt[0]=0; // printf("%d ",i ); for (int j = 1; j <= n; ++j) { if ((1<<(j-1))&i) bt[j]=bt[j-1]+1; else bt[j]=bt[j-1]; } for (int p = 0; p < 4; ++p) { go[0]=0; for (int j = 1; j <= n; ++j) { if (l[p]==s[j-1]) go[j]=bt[j-1]+1; else go[j]=max(go[j-1],bt[j]); } int tmp=0; for (int j = 1; j <= n; ++j) if (go[j]-go[j-1]) { tmp|=1<<(j-1); } to[i][p]=tmp; // printf("%d|",tmp ); } // puts(""); } memset(dp[0],0,sizeof dp[0]); dp[0][0]=1; for (int i=1;i<=m;i++) { memset(dp[i&1],0,sizeof dp[i&1]); for (int j=0;j<(1<<(n+1));j++) { if (dp[i&1^1][j]==0) continue; for (int p=0;p<4;p++) { dp[i&1][to[j][p]]+=dp[i&1^1][j]; dp[i&1][to[j][p]]%=mod; } } // for (int j=0;j<(1<<(n+1));j++) // printf("%d ",dp[i&1][j]); // puts(""); } memset(t,0,sizeof t); for (int j=0;j<(1<<(n+1));j++) { t[bitc(j)]+=dp[m&1][j]; t[bitc(j)]%=mod; } for (int i=0;i<=n;i++) printf("%d\n",t[i]); } return 0; } /* 1 GTC 10 1 22783 528340 497452 */
[hdu 4899]14年多校第四场C Hero meet devil 状压DP,布布扣,bubuko.com
[hdu 4899]14年多校第四场C Hero meet devil 状压DP
标签:dp
原文地址:http://blog.csdn.net/ahm001/article/details/38358349