HDU4545
2644 단어 ACM - 동적 기획ACM - - 알고리즘 문제 풀이 집합
Time Limit: 3000/1000 MS(Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1172 Accepted Submission(s): 470
Problem Description
샤 오 밍 과 그의 친 한 친구 샤 오 서 는 새로운 게임 을 하고 있다. 샤 오 밍 은 소문 자로 구 성 된 문자열 을 주 고 샤 오 밍 은 서쪽 보다 더 긴 문자열 을 주 고 소문 자로 구성 되 어 있다. 마법 의 전환 을 통 해 샤 오 밍 의 꼬치 와 서쪽 을 같은 문자열 로 만 들 수 있다 면 두 사람 은 모두 기뻐 할 것 이다.여기 서 마법 은 샤 오 밍 의 문자열 이 어떤 문 자 를 임의로 삭제 하거나 문자 변화 표 의 변 화 를 대조 하 는 것 을 말한다.예 를 들 어 서쪽 꼬치 는 abba 입 니 다.샤 오 밍 의 꼬치 는 addba 입 니 다. 문자 변화 표 d b (d 를 b 로 변환 할 수 있 음 을 표시 함).그러면 샤 오 밍 은 첫 번 째 d 를 삭제 한 후에 두 번 째 d 를 b 로 바 꾸 어 꼬치 를 abba 로 바 꿀 수 있다.이제 그들 이 마법 전환 을 통 해 두 사람의 꼬치 를 똑 같이 만 들 수 있 을 지 판단 해 주세요.
Input
먼저 T 를 입력 하면 모두 T 조 테스트 데이터 (T < = 40) 가 있 음 을 나타 낸다.다음은 총 T 조 데이터 입 니 다. 각 조 의 데이터 첫 줄 은 서쪽 문자열 을 입력 하고 두 번 째 줄 은 샤 오 밍 문자열 을 입력 합 니 다. (데 이 터 는 문자열 의 길이 가 1000 을 초과 하지 않 고 샤 오 밍 의 문자열 의 길 이 는 서쪽 과 같 으 며 모든 문 자 는 소문 자 입 니 다)이 어 알파벳 을 입력 하고 m 를 먼저 입력 하면 m 문자 변환 방식 (m < = 100) 이 있 음 을 나타 낸다. 이 어 m 줄 마다 두 개의 소문 자 를 입력 하면 앞의 것 이 뒤의 것 으로 변 할 수 있 음 을 나타 낸다 (그러나 뒤의 것 이 앞의 것 으로 변 할 수 있 는 것 은 아니다).
Output
각 그룹의 데이터 에 대해 먼저 Case 수 를 출력 합 니 다.마법 변환 을 통 해 두 사람의 꼬치 를 똑 같이 만 들 수 있다 면 'happy' 를 출력 하고 그렇지 않 으 면 'unhappy' 를 출력 합 니 다.각 그룹의 데이터 가 한 줄 을 차지 하고 구체 적 인 출력 형식 은 샘플 을 참조 합 니 다.
Sample Input
2
abba
addba
1
d b
a
dd
0
Sample Output
Case #1: happy
Case #2: unhappy
분석: 각각 소 서 와 샤 오 밍 의 꼬치 를 S1 과 S2 로 하고 d [n] 은 꼬치 S2 의 앞 n 글자 가 꼬치 S1 의 앞 m 문자 (d [n] [m] = 1 시 에 할 수 있 는 지, d [n] [m] = 0 시 에 할 수 없 는 지 를 나타 낸다.
d [n] [m] = max {d [n - 1] [m], {d [n - 1] [m - 1] | n > = m, s2 [n] = s1 [m] 또는 s2 [n] 은 s1 [m]} 로 변환 할 수 있 습 니 다. }
즉, 두 번 째 문자열 의 마지막 문자 가 삭제 되 거나 첫 번 째 문자열 의 마지막 문자 로 변환 할 수 있 습 니 다.
경계: 의 D [I] [J] = 0; I = 0
메모: 원제 문자 변환 이 꼭 유일한 것 은 아 닙 니 다. d 가 b, a 등 이 될 수 있 습 니 다.
#include
#include
#include
using namespace std;
char x[200],y[200];
int m;
char s1[1100],s2[1100];
int d[1200][1200];
int main()
{
int t;
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
scanf("%s %s",s1,s2);
int len1=strlen(s1),len2=strlen(s2);
int m;
scanf("%d",&m);
for(int i=0;i=j)
{
d[i][j]=d[i-1][j];
bool change=false;
for(int c=0;c