您的位置:首页 > 其它

hdu 4545 魔法串

2017-10-11 23:21 197 查看
思路: dp , dp[i][j] 代表小明的前 j 个字符可以 转换成前 小西 前 i 个字符。

              三种情况:

              if(dp[i][j-1])
{
dp[i][j] = true;
continue;
 }
   
    if(ch[i] == sh[j] && dp[i-1][j-1])
    {
    dp[i][j] = true;
    continue;
}

if(pan[ch[i]-'a'][sh[j]-'a'] && dp[i-1][j-1] )
{
dp[i][j] = true;
continue;                                                   


             1. 小明前 j - 1 个字符 已经可以转换成  小西 前 i 字符 , 那么 前 j 个 肯定也行。

             2.小明 第 j 个字符 等于 小西 第 i 个 字符, 且 [b]dp[i-1][j-1] 为 true.[/b]

[b]             3.[b]小明 第 j 个字符 可以以通过转换 等于 小西 第 i 个 字符[/b][/b]

[b][b]代码:[/b][/b]

#include <stdio.h>
#include <string.h>
const int N = 1010;
bool pan[30][30];
bool dp

;
int main()
{
int t, m;
char ch
, sh
;
scanf("%d ",&t);
for(int k=1; k<=t; k++)
{
scanf("%s %s",ch+1, sh+1);
int m;
scanf("%d",&m);
char a , b;
memset(pan, false, sizeof(pan));

for(int i=1; i<=m; i++)
{
scanf(" %c %c", &a, &b);
pan[b-'a'][a-'a'] = true;
}

int clen = strlen(ch+1), slen = strlen(sh+1);

memset(dp, false, sizeof(dp));

for(int i=0; i<=slen; i++)
dp[0][i] = true;

for(int i=1; i<=clen; i++)
{
for(int j=1; j<=slen; j++)
{
if(dp[i][j-1])
{
dp[i][j] = true;
continue;
}

if(ch[i] == sh[j] && dp[i-1][j-1])
{
dp[i][j] = true;
continue;
}

if(pan[ch[i]-'a'][sh[j]-'a'] && dp[i-1][j-1] )
{
dp[i][j] = true;
continue;
}

}
}

if(dp[clen][slen])
printf("Case #%d: happy\n",k);
else
printf("Case #%d: unhappy\n",k);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: