poj 2264(LCS)
2016-04-23 18:52
369 查看
Advanced Fruits
Description
The company "21st Century Fruits" has specialized in creating new sorts of fruits by transferring genes from one fruit into the genome of another one. Most times this method doesn't work, but sometimes, in very rare cases, a new fruit emerges that tastes like a mixture between both of them.
A big topic of discussion inside the company is "How should the new
creations be called?" A mixture between an apple and a pear could be
called an apple-pear, of course, but this doesn't sound very
interesting. The boss finally decides to use the shortest string that
contains both names of the original fruits as sub-strings as the new
name. For instance, "applear" contains "apple" and "pear" (APPLEar and
apPlEAR), and there is no shorter string that has the same property.
A combination of a cranberry and a boysenberry would therefore be called a "boysecranberry" or a "craboysenberry", for example.
Your job is to write a program that computes such a shortest name
for a combination of two given fruits. Your algorithm should be
efficient, otherwise it is unlikely that it will execute in the alloted
time for long fruit names.
Input
Each
line of the input contains two strings that represent the names of the
fruits that should be combined. All names have a maximum length of 100
and only consist of alphabetic characters.
Input is terminated by end of file.
Output
For
each test case, output the shortest name of the resulting fruit on one
line. If more than one shortest name is possible, any one is acceptable.
Sample Input
Sample Output
Source
Ulm Local 1999
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 2158 | Accepted: 1066 | Special Judge |
The company "21st Century Fruits" has specialized in creating new sorts of fruits by transferring genes from one fruit into the genome of another one. Most times this method doesn't work, but sometimes, in very rare cases, a new fruit emerges that tastes like a mixture between both of them.
A big topic of discussion inside the company is "How should the new
creations be called?" A mixture between an apple and a pear could be
called an apple-pear, of course, but this doesn't sound very
interesting. The boss finally decides to use the shortest string that
contains both names of the original fruits as sub-strings as the new
name. For instance, "applear" contains "apple" and "pear" (APPLEar and
apPlEAR), and there is no shorter string that has the same property.
A combination of a cranberry and a boysenberry would therefore be called a "boysecranberry" or a "craboysenberry", for example.
Your job is to write a program that computes such a shortest name
for a combination of two given fruits. Your algorithm should be
efficient, otherwise it is unlikely that it will execute in the alloted
time for long fruit names.
Input
Each
line of the input contains two strings that represent the names of the
fruits that should be combined. All names have a maximum length of 100
and only consist of alphabetic characters.
Input is terminated by end of file.
Output
For
each test case, output the shortest name of the resulting fruit on one
line. If more than one shortest name is possible, any one is acceptable.
Sample Input
apple peach ananas banana pear peach
Sample Output
appleach bananas pearch
Source
Ulm Local 1999
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; int dp[105][105]; int flag[105][105]; char str[105],str1[105]; char P[105]; int k; void print(int l,int r) { if(l == 0 && r == 0) return; if(flag[l][r] == 0) { print(l-1,r-1); printf("%c",str[l]); } else if(flag[l][r] == 1) { print(l-1,r); printf("%c",str[l]); } else { print(l,r-1); printf("%c",str1[r]); } } void LCS() { memset(flag,0,sizeof(flag)); int n= strlen(str+1); int m = strlen(str1+1); for(int i = 1; i <= n; i++) ///初始化不能少 flag[i][0] = 1; for(int i = 1; i <= m; i++) ///same flag[0][i] = -1; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(str[i]==str1[j]) { dp[i][j]=dp[i-1][j-1]+1; flag[i][j]=0; } else { if(dp[i-1][j]>dp[i][j-1]) { dp[i][j]=dp[i-1][j]; flag[i][j]=1; } else { dp[i][j]=dp[i][j-1]; flag[i][j]=-1; } } } } print(n,m); printf("\n"); } int main() { while(scanf("%s%s",str+1,str1+1)!=EOF) { LCS(); } return 0; }
相关文章推荐
- stm32程序下载方式总结
- 查询某个字段不同值各自最新的一条数据记录SQL语句
- CodeForces - 427A (警察和罪犯 思维题)
- UVA - 409
- http://blog.csdn.net/fbysss/article/details/8024748
- rsync+sersync实战
- bzoj4547 小奇的集合
- c# 获取网页源码
- 算法学习之简单排序
- HttpClient4.5.2请求时出现Cookie rejected警告的解决方法
- DayDayUP_Linux运维学习_oracle11g安装教程
- 算法--递推策略
- 以操作系统的角度述说线程与进程
- j2ee 数据存储乱码问题
- 怎么使用WireShark抓包
- java并发之Thread
- CSS3梅花三弄特效
- webservice的相关知识
- WebService的初步探究与应用-01
- Mac通过RVI使用Wireshark对iPhone抓包