HDU 1523 Decoding Morse Sequences

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1523

此题大意为 给你一串摩尔斯密码  再给你一个字典(下面单词本)

用下面的单词组合成给你的摩尔斯密码, 问最多有多少种不同的组合方式。

题解分析:

1.设字符串的长度为len ,  判断dp[i]处是否可达, 若可达则遍历整个单词表。

2.要先把dp[0]设为1,遍历单词表,若此单词可以在 i 处匹配则 dp[i+L] += dp[i], L(这个单词转成摩尔斯密码后的字符长度);

3.最后输出dp[len];

下面是代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 char Morse[26][5]={{".-"},{"-..."},{"-.-."},{"-.."},
 5 {"."},{"..-."},{"--."},{"...."},{".."},{".---"},{"-.-"},{".-.."},
 6 {"--"},{"-."},{"---"},{".--."},{"--.-"},{".-."},{"..."},{"-"},
 7 {"..-"},{"...-"},{".--"},{"-..-"},{"-.--"},{"--.."}};
 8 
 9 char Dict[10005][205];//字典保存每个单词
10 int dp[40005];
11 int main()
12 {
13     int T, i, n, len, j, a;
14     char str[10270], str2[270];
15     scanf("%d",&T);
16     while(T--)
17     {
18         scanf("%s",str);
19         len = strlen(str);
20         scanf("%d",&n);
21         memset(dp,0,sizeof(dp));
22         for(i=0; i<n; i++)//转化词典
23         {
24             Dict[i][0]=NULL;//每次到要初始化
25 
26             scanf("%s",str2);
27             for(j=0; str2[j]; j++)
28                 strcat(Dict[i],Morse[str2[j]-'A']);
29         }
30         dp[0] = 1;
31         for(i=0; i<len; i++)
32         {
33             if(dp[i])
34             {
35                 for(j=0; j<n; j++)
36                 {
37                     a = strlen(Dict[j]);
38 
39                     if(strncmp(str+i,Dict[j],a) == 0)//若此处可以匹配
40                         dp[i+a] += dp[i];
41                 }
42             }
43         }
44         printf("%d\n",dp[len]);
45     }
46     return 0;
47 }

 

posted @ 2014-08-01 17:44  向前走丶不回首  阅读(302)  评论(0编辑  收藏  举报