您的位置:首页 > 产品设计 > UI/UE

[HDOJ 1560][Vjudge 23158] DNA sequence [动态规划+状态压缩]

2014-07-12 09:54 295 查看
给定一个若干个字符串,问一个最短的字符串的长度,要求前面的每个字符串都是这个字符串的子序列

数据范围:字符串个数不大于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: