poj 3073 Spam(注意转义字符‘\’+dp)

来源:互联网 发布:mac打开xlsx 不能编辑 编辑:程序博客网 时间:2024/05/16 18:24

题目链接:

点击打开链接

题目大意:

每种字符可以转换为不同的字符串,问给出一个字符串,能够有多少种不同的组合出它的方法

题目分析:

先把转换用的表打出来

然后定义dp[i][j]表示到第i位以第j个字母对应的字符串结尾的匹配数,然后每次枚举26个字符串,判断相等,如果相等的话,len为当前枚举字符串的长度,那么dp[i][j] += dp[i-len][k],0<=k< 26;

最后输出以26个字母结尾的合法数的和即可


wa了好久,就因为一个转义字符不能直接存,我也是醉了。。。。。在这里我把它换成8来表示

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#define MAX 300#define N 507using namespace std;char  str[N];int dp[N][N];char s[MAX][MAX]={    "4",//A    "|3",//B    "(",//C    "|)",//D    "3",//E    "|=",//F    "6",//G    "#",//H    "|",//I    "_|",//J    "|<",//K    "|_",//L    "|8/|",//M    "|8|",//N    "0",//O    "|0",//P    "(,)",//Q    "|?",//R    "5",//S    "7",//T    "|_|",//U    "8/",//V    "8/8/",//w    "><",//X    "-/",//Y    "2",//Z};int main ( ){    char ss[MAX];    while ( ~scanf ( "%s" , ss ))    {        if ( !strcmp( ss , "end")) break;        int cnt = 0;        int len3 = strlen ( ss );        for ( int i = 0 ; i < len3 ; i++ )        {            int len4 = strlen ( s[ss[i]-'A']);            for ( int j = 0 ; j < len4 ; j++ )                str[cnt++] = s[ss[i]-'A'][j];        }        str[cnt++] = '\0';       // printf ( "%s\n" , str  );        memset ( dp , 0 , sizeof ( dp ) );        dp[0][0] = 1;        int len = strlen(str);        for ( int i = 1 ; i <= len ; i++ )            for ( int j = 0 ; j < 26 ; j++ )            {                int len2 = strlen ( s[j] );                if ( str[i-1] != s[j][len2-1] ) continue;                if ( len2 > i ) continue;                bool flag = false;                int id = i-1;                for ( int k = len2-1 ; k >= 0; k-- )                    if ( s[j][k] != str[id--] ) flag = true;                if ( flag ) continue;                for ( int k = 0 ; k < 26 ; k++ )                {                    dp[i][j] += dp[i-len2][k];                }            }        int ans = 0;        for ( int i = 0 ; i < 26 ; i++ )        {            ans += dp[len][i];        }        printf ( "%d\n" , ans );    }}


0 0
原创粉丝点击