String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 11    Accepted Submission(s): 4

Problem Description
Given 3 strings A, B, C, find the longest string D which satisfy the following rules:
a) D is the subsequence of A
b) D is the subsequence of B
c) C is the substring of D
Substring here means a consecutive subsequnce.
You need to output the length of D.
 
Input
The first line of the input contains an integer T(T = 20) which means the number of test cases.
For each test case, the first line only contains string A, the second line only contains string B, and the third only contains string C.
The length of each string will not exceed 1000, and string C should always be the subsequence of string A and string B.
All the letters in each string are in lowercase.
 
Output
For each test case, output Case #a: b. Here a means the number of case, and b means the length of D.
 
Sample Input
2
aaaaa
aaaa
aa
abcdef
acebdf
cf
 
Sample Output
Case #1: 4
Case #2: 3

Hint

For test one, D is "aaaa", and for test two, D is "acf".

 
Source
 
Recommend
zhuyuanchen520
 

明显的DP题。

求最长公共子串,正和倒各求一次,得到dp和dp3

dp[i][j]表示str1的前i个字符 和 str2的前j个字符 最长的公共子串。

dp3[i][j]表示str1的后i个字符 和 str2的后j个字符 最长的公共子串。

dp1[i][j]表示str3的前j个字符,和str1的前i个字符匹配,最后的匹配起始位置,为-1表示不能匹配。

dp2一样

然后枚举str3在str1,str2匹配的终点

  1. /* ***********************************************
  2. Author :kuangbin
  3. Created Time :2013/8/15 12:34:55
  4. File Name :F:\2013ACM练习\2013多校8\1006.cpp
  5. ************************************************ */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <iostream>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <queue>
  13. #include <set>
  14. #include <map>
  15. #include <string>
  16. #include <math.h>
  17. #include <stdlib.h>
  18. #include <time.h>
  19. using namespace std;
  20.  
  21. const int MAXN = ;
  22. char str1[MAXN],str2[MAXN],str3[MAXN];
  23. int dp1[MAXN][MAXN];
  24. int dp2[MAXN][MAXN];
  25. int dp[MAXN][MAXN];
  26. int dp3[MAXN][MAXN];
  27. int main()
  28. {
  29. //freopen("in.txt","r",stdin);
  30. //freopen("out.txt","w",stdout);
  31. int T;
  32. scanf("%d",&T);
  33. int iCase = ;
  34. while(T--)
  35. {
  36. iCase++;
  37. scanf("%s%s%s",str1,str2,str3);
  38. int len1 = strlen(str1);
  39. int len2 = strlen(str2);
  40. int len3 = strlen(str3);
  41. for(int i = ; i <= len1;i++)
  42. dp[i][] = ;
  43. for(int i = ;i <= len2;i++)
  44. dp[][i] = ;
  45. for(int i = ;i <= len1;i++)
  46. for(int j = ;j <= len2;j++)
  47. {
  48. dp[i][j] = max(dp[i-][j],dp[i][j-]);
  49. if(str1[i-] == str2[j-])
  50. dp[i][j] = max(dp[i][j],dp[i-][j-]+);
  51. }
  52. for(int i = ; i <= len1;i++)
  53. dp3[i][] = ;
  54. for(int i = ;i <= len2;i++)
  55. dp3[][i] = ;
  56. for(int i = ;i <= len1;i++)
  57. for(int j = ;j <= len2;j++)
  58. {
  59. dp3[i][j] = max(dp3[i-][j],dp3[i][j-]);
  60. if(str1[len1-i] == str2[len2-j])
  61. dp3[i][j] = max(dp3[i][j],dp3[i-][j-]+);
  62. }
  63. for(int i = ;i <= len3;i++)
  64. dp1[][i] = -;
  65. for(int i = ;i <= len1;i++)
  66. dp1[i][] = i;
  67. for(int i = ;i <= len1;i++)
  68. for(int j = ;j <= len3;j++)
  69. {
  70. if(str1[i-] == str3[j-])
  71. dp1[i][j] = dp1[i-][j-];
  72. else dp1[i][j] = dp1[i-][j];
  73. }
  74. for(int i = ;i <= len3;i++)
  75. dp2[][i] = -;
  76. for(int i = ;i <= len2;i++)
  77. dp2[i][] = i;
  78. for(int i = ;i <= len2;i++)
  79. for(int j = ;j <= len3;j++)
  80. {
  81. if(str2[i-] == str3[j-])
  82. dp2[i][j] = dp2[i-][j-];
  83. else dp2[i][j] = dp2[i-][j];
  84. }
  85. int ans = ;
  86. for(int i = ;i <= len1;i++)
  87. for(int j = ;j <= len2;j++)
  88. {
  89. int t1 = dp1[len1-i][len3];
  90. int t2 = dp2[len2-j][len3];
  91. if(t1 == - || t2 == -)continue;
  92. ans = max(ans,dp3[i][j]+dp[t1][t2]);
  93. }
  94. printf("Case #%d: %d\n",iCase,ans+len3);
  95. }
  96. return ;
  97. }

HDU 4681 String(2013多校8 1006题 DP)的更多相关文章

  1. HDU 4691 Front compression (2013多校9 1006题 后缀数组)

    Front compression Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Othe ...

  2. HDU 4671 Backup Plan (2013多校7 1006题 构造)

    Backup Plan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  3. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

  4. HDU 4704 Sum (2013多校10,1009题)

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submi ...

  5. HDU 4699 Editor (2013多校10,1004题)

    Editor Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  6. HDU 4696 Answers (2013多校10,1001题 )

    Answers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  7. HDU 4686 Arc of Dream (2013多校9 1001 题,矩阵)

    Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  8. HDU 4685 Prince and Princess (2013多校8 1010题 二分匹配+强连通)

    Prince and Princess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  9. HDU 4678 Mine (2013多校8 1003题 博弈)

    Mine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 大数据系列之分布式数据库HBase-0.9.8安装及增删改查实践

    若查看HBase-1.2.4版本内容及demo代码详见 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践 1. 环境准备: 1.需要在Hadoop启动正常情况下安 ...

  2. How to insert a segment of noise to music file

    如何向音频文件中插入噪声 为了研究噪声和音乐对EEG的的影响,实验前需要准备一段夹杂噪声的音乐. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  3. POJ 2348 Euclid's Game(辗转相除博弈+自由度分析)

    题目链接:http://poj.org/problem?id=2348 题目大意:给你两个数a,b,Stan和Ollie轮流操作,每次可以将较大的数减去较小的数的整数倍,相减后结果不能小于0,谁先将其 ...

  4. 翻译:MLAPP(2.1节 概率概述)

    笔者:尝试翻译MLAPP(Machine Learning: a Probabilistic Perspective)一书,供机器学习的学者参考,如有错误理解之处请指出,不胜感激!(如需转载,请联系本 ...

  5. Android Webview中解决H5的音视频不能自动播放的问题

    在开发webview的时候,当加载有声音的网页的时候,声音不会自动播放, 解决方法:在webview中调用js方法.这个方法需要在webview的setWebViewClient方法之后在onPage ...

  6. 【UOJ】#79. 一般图最大匹配

    题解 板子!我相信其实没人来看我的板子!但是为了防止我忘记,我还是要写点什么 我们考虑二分图,为什么二分图就能那么轻松地写出匹配的代码呢?因为匹配只会发生在黑点和白点之间,我们找寻增广路,必然是一黑一 ...

  7. 在LoadRunner中从数组类型的参数随机取值的方法

    在LoadRunner中从数组类型的参数随机取值的方法 使用web_reg_save_param做关联后,有时候会有多个匹配值. 为了模仿用户行为随机取一个值为后续transcation所用,可以使用 ...

  8. Windows 8.1 操作系统常用快捷键

    安装了 windows 8.1 有一段时间了,刚使用时有点儿不太习惯,后面知道了一些常用快捷键后,使用起来习惯多了.下面是一些常用的 Windows 8.1 快捷键: Ctrl + Tab: 访问所有 ...

  9. 洛谷P3457 [POI2007]POW-The Flood [并查集,模拟]

    题目传送门 pow 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方形,地图上已经标注了它的海拔高度以及它是 ...

  10. Python 函数系列- Str

    Str函数的一些有趣的用法 str = '1234567890' print(str[:]) #取全部字符串 print(str[2]) #取下标是2的字符 -- 3 print(str[:3]) # ...