HDU4545+LCS

最长公共子序列。

 1 /*
 2 LCS 最长公共子序列
 3 */
 4 #include<stdio.h>
 5 #include<string.h>
 6 #include<stdlib.h>
 7 #include<algorithm>
 8 #include<iostream>
 9 #include<queue>
10 #include<map>
11 #include<math.h>
12 using namespace std;
13 typedef long long ll;
14 //typedef __int64 int64;
15 const int maxn = 1005;
16 const int inf = 0x7fffffff;
17 const double pi=acos(-1.0);
18 const double eps = 1e-8;
19 int dp[ maxn ][ maxn ];
20 char s1[ maxn ],s2[ maxn ];
21 bool ss[ 30 ][ 30 ];
22 //map<char,char>mp;
23 void init(){
24     memset( dp,0,sizeof( dp ) );
25     //for( int i=0;i<26;i++ ){
26         //mp[ 'a'+i ] = '@';
27     //}
28     memset( ss,false,sizeof( ss ) );
29 }
30 bool same( int x,int y ){
31     if( s1[x]==s2[y]||ss[s2[y]-'a'][s1[x]-'a']==true ) return true;
32     else return false;
33 }
34 int main(){
35     int T;
36     while( scanf("%d",&T)!=EOF ){
37         int Case = 1;
38         while( T-- ){
39             scanf("%s",s1);
40             scanf("%s",s2);
41             init();
42             int q;
43             scanf("%d",&q);
44             char a[12],b[12];
45             while( q-- ){
46                 scanf("%s",a);
47                 scanf("%s",b);
48                 ss[a[0]-'a'][b[0]-'a']=true;
49                 //mp[ a[0] ] = b[0];
50             }
51             int len1 = strlen( s1 );
52             int len2 = strlen( s2 );
53             for( int i=0;i<=len1;i++ )
54                 dp[ i ][ 0 ] = 0;
55             for( int i=0;i<=len2;i++ )
56                 dp[ 0 ][ i ] = 0;
57             for( int i=1;i<=len1;i++ ){
58                 for( int j=1;j<=len2;j++ ){
59                     if( same( i-1,j-1 )==true )
60                         dp[ i ][ j ] = dp[ i-1 ][ j-1 ]+1;
61                     else
62                         dp[ i ][ j ] = max( dp[i-1][j],dp[i][j-1] );
63                     //printf("dp[%d][%d]=%d\n",i,j,dp[i][j]);
64                 }
65             }
66             if( dp[len1][len2]!=len1 ) printf("Case #%d: unhappy\n",Case++);
67             else printf("Case #%d: happy\n",Case++);
68         }
69     }
70     return 0;
71 }
View Code

 

posted @ 2013-08-09 20:53  xxx0624  阅读(260)  评论(0编辑  收藏  举报