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;
}
三种情况:
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;
}
相关文章推荐
- HDU 4545 魔法串
- hdu_4545_魔法串
- hdu 4545 西山居一 魔法串
- hdu 4545 魔法串 (模拟)
- hdu 4545 魔法串
- HDU 4545-魔法串-字符串
- HDU 4545 魔法串
- hdu 4545 魔法串 2013金山西山居创意游戏程序挑战赛——初赛(1)
- HDU 4545 魔法串
- HDU-4545魔法串
- HDU 4545 魔法串(water!)
- hdu-4545-魔法串
- hdu----(4545)魔法串(LCS)
- HDU 4545 魔法串
- hdu 4545 魔法串
- hdu 4545 魔法串【水水】
- HDU 4545 魔法串
- hdu 4545 魔法串 dp
- hdu 4545 魔法串
- HDU-4545-魔法串