HDU 1523 Decoding Morse Sequences

时间:2021-02-26 14:34:33

题目链接: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];

下面是代码:

 #include<stdio.h>
#include<string.h> char Morse[][]={{".-"},{"-..."},{"-.-."},{"-.."},
{"."},{"..-."},{"--."},{"...."},{".."},{".---"},{"-.-"},{".-.."},
{"--"},{"-."},{"---"},{".--."},{"--.-"},{".-."},{"..."},{"-"},
{"..-"},{"...-"},{".--"},{"-..-"},{"-.--"},{"--.."}}; char Dict[][];//字典保存每个单词
int dp[];
int main()
{
int T, i, n, len, j, a;
char str[], str2[];
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
len = strlen(str);
scanf("%d",&n);
memset(dp,,sizeof(dp));
for(i=; i<n; i++)//转化词典
{
Dict[i][]=NULL;//每次到要初始化 scanf("%s",str2);
for(j=; str2[j]; j++)
strcat(Dict[i],Morse[str2[j]-'A']);
}
dp[] = ;
for(i=; i<len; i++)
{
if(dp[i])
{
for(j=; j<n; j++)
{
a = strlen(Dict[j]); if(strncmp(str+i,Dict[j],a) == )//若此处可以匹配
dp[i+a] += dp[i];
}
}
}
printf("%d\n",dp[len]);
}
return ;
}