poj 1432 Decoding Morse Sequences

原创 2012年03月28日 15:58:02

题目链接:http://poj.org/problem?id=1432

题目大意及思路:计算一段文摩斯码可能的译文种数,定义dp[i]为前i个摩斯码的种数,然后枚举最后一个单词的摩斯码长度,将所有可能加起来;要注意的是有些单词的摩斯码相同。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
#include<list>
#include<iostream>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define Max 110
int max(int a,int b)
{
	return a>b?a:b;
}
int min(int a,int b)
{
	return a<b?a:b;
}
string rec;
char s[10100],str[10100];
int dp[10100];
int len;
char cod[26][5]={
            ".-","-...","-.-.","-..",
            ".","..-.","--.","....",
            "..",".---","-.-",".-..",
            "--","-.","---",".--.",
            "--.-",".-.","...","-",
            "..-","...-",".--","-..-",
            "-.--","--.."
            };
map<string ,int>mp;
int main()
{
    int t,n,i,j,k;
    scanf("%d",&t);
   // getchar();
 //   cout<<cod[0];
    while(t--)
    {
        mp.clear();
        memset(dp,0,sizeof(dp));
       scanf("%s",s+1);
       len=strlen(s+1);
   //    printf("len %d\n",len);
       scanf("%d",&n);
       for(i=0;i<n;i++)
       {
            scanf("%s",str);
          //  int len=strlen(str);
            string tmp;
            for(j=0;str[j];j++)
                tmp+=cod[str[j]-'A'];
           // cout<<tmp<<endl;
            mp[tmp]++;
       }
       dp[0]=1;
       for(i=1;i<=len;i++)
            for(j=i-1;j>=i-81&&j>=0;j--)
            {
                if(dp[j]==0)
                    continue;
                char a[100];
                for(k=j+1;k<=i;k++)
                {
                    a[k-j-1]=s[k];
                }
                a[k-j-1]=0;

                  //  cout<<a<<endl;
                    dp[i]+=dp[j]*mp[a];
              //  printf("i %d dp %d\n",i,dp[i]);
            }
        printf("%d\n",dp[len]);
    }
}


 

相关文章推荐

POJ 1432 Decoding Morse Sequences

题意给出一个字母的译码表,给出一个有n个单词的字典,给出一串编码。问再给出字典中有多少种不同的解码方式。分析首先编码只有-和.,可以很方便地建立一棵Trie树,还是最熟悉的二叉方式。 然...
  • D042412
  • D042412
  • 2015年07月16日 19:21
  • 393

HDU 2844+POJ 1014 +FZU 1432详解(多重背包&&二进制优化)

相信很多人都在查资料的过程当中,了解到了二进制优化这个概念,但是还是感觉云里雾里的。既然无法知其所以然,那就退而求其次,知其然好了。 具体方法: 如果1个物品有13件,其价值为3,重量为2. 首先我们...

POJ 1018 & HDU 1432 Lining Up 【简单几何】

Lining Up Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24786   Acc...

两次dp-poj-1239-Increasing Sequences

题目链接: http://poj.org/problem?id=1239 题目大意: 给一个数字串(不超过80位),可以在数字之间添加逗号,分成几个数,要求最后形成一个严格递增的序列,且要求最后一个...

ZOJ1499 POJ1239 HDU1511 Increasing Sequences

非常经典的DP题!必须要好好研究! 需要两次dp,第一次dp正向,dp[i]的值x表示的是到了i,i前面的x个字符(包含i)组成数值后,前i个字符符合上升队列,且x为最大。则我们可以知道前i-dp[...
  • neofung
  • neofung
  • 2012年04月06日 19:51
  • 1373

poj 1239 Increasing Sequences

题目链接:http://poj.org/problem?id=1239 题目大意:求使最后一个数最大且前面的数尽量大的加逗号方式,两次dp,先从前到后求得最后一个数,然后反向dp,求出满足条件且当前...

poj1776 Task Sequences--竞赛图下的哈密顿通路+入门

原题链接:http://poj.org/problem?id=1776 题意:n个任务,一个n*n的数组,(i,j)该位置是1表示做了i任务机器直接做j,如果是0,机器做完i,机器就会关闭,...
  • LaoJiu_
  • LaoJiu_
  • 2016年11月13日 09:41
  • 819

POJ 2034 Anti-prime Sequences

题意:输入m, n, d。 求出m,m+1,m+2,````m+n的一个排列。使得任意的连续k个数之和都为合数,2 思路:素数打表,然后深搜。。 //196K 782MS #include #...

poj 2034 Anti-prime Sequences(dfs)

http://poj.org/problem?id=2034 大致题意:给出区间[n,m],对这个区间的数进行排列使得相邻的2个、3个......d个数之和都不是素数。输出字典序最小的。 ...

POJ 2034 Anti-prime Sequences(素数预处理+DFS回溯)

POJ 2034 Anti-prime Sequences(素数预处理+DFS回溯) http://poj.org/problem?id=2034 题意:给你一个n,n+1,n+2,n+3,…m的数字...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1432 Decoding Morse Sequences
举报原因:
原因补充:

(最多只允许输入30个字)