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 }