[HDOJ 1560][Vjudge 23158] DNA sequence [动态规划+状态压缩]
2014-07-12 09:54
295 查看
给定一个若干个字符串,问一个最短的字符串的长度,要求前面的每个字符串都是这个字符串的子序列
数据范围:字符串个数不大于8个,字符串长度不大于5
状态压缩DP,状态为目前每个字符串还剩多长没有匹配时的最短字符串长度,初始状态dp[len1][len2]...[lenn]=0,结束状态dp[0][0]...[0]即为结果
数据范围:字符串个数不大于8个,字符串长度不大于5
状态压缩DP,状态为目前每个字符串还剩多长没有匹配时的最短字符串长度,初始状态dp[len1][len2]...[lenn]=0,结束状态dp[0][0]...[0]即为结果
#include <cstdio> #include <cstring> int dp[1700000]; int n; char s[8][6]; int cur[8]; int product[8]={1,6,36,216,1296,7776,46656,279936}; void cal(int i,char c) { int x=dp[i]; for (int j=0;j<n;j++) { if (cur[j]!=0) { if (s[j][cur[j]-1]==c) i-=product[j]; } } if (dp[i]==-1||dp[i]>x) dp[i]=x+1; } int main() { int t,i,from,j; scanf("%d",&t); while (t--) { memset(dp,-1,sizeof(dp)); from=0; scanf("%d",&n); for (i=0;i<n;i++) { scanf("%s",s[i]); from+=strlen(s[i])*product[i]; } dp[from]=0; for (i=from;i>=0;i--) { if (dp[i]!=-1) { int x=i; for (j=0;j<n;j++) { cur[j]=x%6; x/=6; } cal(i,'A'); cal(i,'C'); cal(i,'G'); cal(i,'T'); } } printf("%d\n",dp[0]); } return 0; }
相关文章推荐
- [HDOJ 1560][Vjudge 23158] DNA sequence [IDA*]
- [HDOJ 4899] Hero meet devil [动态规划+状态压缩]
- HDOJ 1560 DNA sequence 状压dp 或 IDA*
- hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】
- HDOJ 4310 - Hero 简单的状态压缩DP
- HDU1560 DNA sequence 迭代深搜IDA*
- BZOJ 1948 CEOI 2006 Connect 状态压缩动态规划
- HDOJ 3001 状态压缩
- BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划
- Vijos 1921 严厉的班长 【状态压缩动态规划】
- HDU - 1560 DNA sequence
- HDOJ 1074.Doing Homework(状态压缩DP)
- HDOJ 1074 Doing Homework (状态压缩)
- 动态规划(5):状态压缩
- 状态压缩动态规划
- 【NOIP2017】宝藏(状态压缩,动态规划)
- [ACM_动态规划] 轮廓线动态规划——铺放骨牌(状态压缩1)
- BZOJ_P4416 [SHOI2013]阶乘字符串(状态压缩动态规划)
- HDOJ 1074 Doing Homework (状态压缩)
- hdu 1560 DNA sequence(迭代加深搜索)