POJ 3192

题意:给定n个DNA字符串,然后可以让两个DNA端点部分交叉,条件是这端点部分能够匹配。问将n个DNA连成一串的最小长度。

题解:像这种n那么小的题就是在诱惑人去暴力,枚举n个DNA的构造顺序,然后依次连接。

View Code
 1 #include<cstdio>

 2 #include<algorithm>

 3 #include<cstring>

 4 using namespace std;

 5 bool vis[10];

 6 char s[10][10];

 7 int n,ans,per[10];

 8 void link(char s1[],char s2[])

 9 {

10     for(int i=0;s1[i]!='\0';i++)

11     {

12         int k=0;

13         while(s1[i+k]!='\0'&&s2[k]!='\0'&&s1[i+k]==s2[k])

14             k++;

15         if(s1[i+k]=='\0')

16         {

17             strcat(s1,s2+k);

18             return;

19         }

20     }

21     strcat(s1,s2);

22 }

23 int solve()

24 {

25     char ss[100];

26     ss[0]='\0';

27     for(int i=0;i<n;i++)

28         link(ss,s[per[i]]);

29     return strlen(ss);

30 }

31 void dfs(int pos)

32 {

33     if(pos==n)

34     {

35         ans=min(solve(),ans);

36         return;

37     }

38     for(int i=0;i<n;i++)

39     {

40         if(!vis[i])

41         {

42             vis[i]=true;

43             per[pos]=i;

44             dfs(pos+1);

45             vis[i]=false;

46         }

47     }

48 }

49 int main()

50 {

51     while(scanf("%d",&n)!=EOF)

52     {

53         for(int i=0;i<n;i++)

54             scanf("%s",s[i]);

55         ans=10000;

56         memset(vis,false,sizeof(vis));

57         dfs(0);

58         printf("%d\n",ans);

59     }

60     return 0;

61 }

你可能感兴趣的:(poj)