hdu1503 Advanced Fruits
2015-12-26 19:55
423 查看
Advanced Fruits
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2300 Accepted Submission(s): 1169
Special Judge
Problem 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
apple peach ananas banana pear peach
Sample Output
appleach bananas pearch
#include <cstdio> #include <cstring> #include <iostream> using namespace std; char s1[105], s2[105], len1, len2; int dp[105][105], mark[105][105]; int sizedp = sizeof(dp), sizem = sizeof(mark); void LCS() { //达到边界中的一个说明另外一个字符串输出完了 for (int i = 1; i <= len1; i++) mark[i][0] = 1; for (int i = 1; i <= len2; i++) mark[0][i] = -1; for (int i = 1; i <= len1; i++) { for (int j = 1; j <= len2; j++) { if (s1[i - 1] == s2[j - 1]) { //注意i - 1, j - 1,因为循环条件 dp[i][j] = dp[i - 1][j - 1] + 1; mark[i][j] = 0; } else { if (dp[i - 1][j] > dp[i][j - 1]) { dp[i][j] = dp[i - 1][j]; mark[i][j] = 1; } else { dp[i][j] = dp[i][j - 1]; mark[i][j] = -1; } } } } } void PrintLCS(int i, int j) { if (!i && !j) return; if (mark[i][j] == 0) { PrintLCS(i - 1, j - 1); printf("%c", s1[i - 1]); //注意i - 1 } else if (mark[i][j] == 1) { PrintLCS(i - 1, j); printf("%c", s1[i - 1]); //注意i - 1 } else if (mark[i][j] == -1) { PrintLCS(i, j - 1); printf("%c", s2[j - 1]); //注意j - 1 } } int main() { while (~scanf("%s%s", s1, s2)) { len1 = strlen(s1); len2 = strlen(s2); memset(dp, 0, sizedp); memset(mark, 0, sizem); LCS(); PrintLCS(len1, len2); puts(""); } return 0; }
相关文章推荐
- NGUI制作字体
- Integer.parseInt()和Integer.valueOf()有什么区别
- paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境
- php require_once()引入文件后,后面的代码无法执行
- iOS学习笔记之自定义UITextView控件(带有placeholder)
- 一个完整的JENKINS下的ANT BUILD.XML文件(Jenkins可以参考)
- UI弹出键盘和收回键盘
- POJ 2524 :Ubiquitous Religions
- 23种设计模式(4)_创建型_建造者模式(Builder Pattern)
- 【APUE】8、pthread_create函数,创建子线程
- lucene.net 使用过程中的 几个注意事项(含termquery 和QueryParser 的区别)
- iOS8开发之iOS8的UIAlertController
- UITableView 上添加button
- [IOS开发教程] IOS UIDevice & IOS检测屏幕旋转实例
- Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence
- LeetCode - N-Queens II
- toString 和String.valueOf
- QueryAddressUtils
- NSString和NSMultableString和NSNumber以及NSValue
- IOS SDK详解之UIAlertController(IOS8之后替代AlertView和ActionSheet)