标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2358 Accepted Submission(s): 1201
Special Judge
1 #include <cstring> 2 #include <algorithm> 3 #include <cstdio> 4 #include <iostream> 5 using namespace std; 6 #define Max 102 7 int dp[Max][Max]; 8 int mark[Max][Max]; 9 char s[Max],t[Max]; 10 int len1,len2; 11 void LCS() //计算LCS,并用mark标记数组记录dp数组的传递过程 12 { 13 int i,j; 14 memset(mark,0,sizeof(mark)); 15 memset(dp,0,sizeof(dp)); 16 for(i=1;i<=len1;i++) 17 { 18 for(j=1;j<=len2;j++) 19 { 20 if(s[i-1]==t[j-1]) 21 { 22 dp[i][j]=dp[i-1][j-1]+1; 23 // cout<<s[i-1]<<" "; 24 mark[i][j]=0; 25 } 26 else if(dp[i-1][j]>=dp[i][j-1]) 27 { 28 dp[i][j]=dp[i-1][j]; //从上面传递下来 29 mark[i][j]=1; 30 } 31 else 32 { 33 dp[i][j]=dp[i][j-1]; //从左边传递下来 34 mark[i][j]=2; 35 } 36 } 37 } 38 39 return; 40 } 41 void output(int i,int j) //回溯输出 42 { 43 /*if(i==0&&j!=0) 44 { 45 output(i,j-1); 46 //printf("%c",t[j-1]); 47 } 48 else if(i!=0&&j==0) 49 { 50 output(i-1,j); 51 //printf("%c",s[i-1]); 52 } 53 else if(i==0&&j==0) 54 return;*/ 55 if(i==0||j==0) 56 return; 57 if(mark[i][j]==0) 58 { 59 output(i-1,j-1); 60 printf("%c",s[i-1]); 61 } 62 else if(mark[i][j]==1) 63 { 64 output(i-1,j); 65 //printf("%c",s[i-1]); 66 } 67 else 68 { 69 output(i,j-1); 70 //printf("%c",t[j-1]); 71 } 72 return; 73 } 74 int main() 75 { 76 int i,j; 77 freopen("in.txt","r",stdin); 78 while(scanf("%s%s",s,t)!=EOF) 79 { 80 len1=strlen(s),len2=strlen(t); 81 LCS(); 82 output(len1,len2); 83 printf("\n"); 84 } 85 }
1 #include <cstring> 2 #include <algorithm> 3 #include <cstdio> 4 #include <iostream> 5 using namespace std; 6 #define Max 102 7 int dp[Max][Max]; 8 int mark[Max][Max]; 9 char s[Max],t[Max]; 10 int len1,len2; 11 void LCS() //计算LCS,并用mark标记数组记录dp数组的传递过程 12 { 13 int i,j; 14 memset(mark,0,sizeof(mark)); 15 memset(dp,0,sizeof(dp)); 16 for(i=1;i<=len1;i++) 17 { 18 for(j=1;j<=len2;j++) 19 { 20 if(s[i-1]==t[j-1]) 21 { 22 dp[i][j]=dp[i-1][j-1]+1; 23 // cout<<s[i-1]<<" "; 24 mark[i][j]=0; 25 } 26 else if(dp[i-1][j]>=dp[i][j-1]) 27 { 28 dp[i][j]=dp[i-1][j]; //从上面传递下来 29 mark[i][j]=1; 30 } 31 else 32 { 33 dp[i][j]=dp[i][j-1]; //从左边传递下来 34 mark[i][j]=2; 35 } 36 } 37 } 38 39 return; 40 } 41 void output(int i,int j) //回溯输出 42 { 43 if(i==0&&j!=0) 44 { 45 output(i,j-1); 46 printf("%c",t[j-1]); 47 } 48 else if(i!=0&&j==0) 49 { 50 output(i-1,j); 51 printf("%c",s[i-1]); 52 } 53 else if(i==0&&j==0) 54 return; 55 else if(mark[i][j]==0) 56 { 57 output(i-1,j-1); 58 printf("%c",s[i-1]); 59 } 60 else if(mark[i][j]==1) 61 { 62 output(i-1,j); 63 printf("%c",s[i-1]); 64 } 65 else 66 { 67 output(i,j-1); 68 printf("%c",t[j-1]); 69 } 70 return; 71 } 72 int main() 73 { 74 int i,j; 75 freopen("in.txt","r",stdin); 76 while(scanf("%s%s",s,t)!=EOF) 77 { 78 len1=strlen(s),len2=strlen(t); 79 LCS(); 80 output(len1,len2); 81 printf("\n"); 82 } 83 }
Advanced Fruits(HDU 1503 LCS变形)
标签:
原文地址:http://www.cnblogs.com/a1225234/p/5223490.html