TOJ 1139.Compromise

2015-06-03

问题简述:

  大概就是输入两段文本(用小写英文字母表示),分别用#表示一段话的结束输入,输出这两个文本的最长公共子序列。

  简单的LCS问题,但是输入的是一段话了,而且公共部分比较是字符串的比较。

  原题链接:http://acm.tju.edu.cn/toj/showp.php?pid=1139

解题思路:

  简单的最长公共子序列问题,只不过过程中比较的是两个字符串,故使用二维字符数组保存输入文本。

  输入 x[1...m][], y[1...n][] ,c[i,j]代表两个文本的LCS的长度,递归方程如下:

  c[0,j] = c[i,0] = 0;

  c[i,j] = c[i-1,j-1] + 1               if x[i]==y[j]

  c[i,j] = max(c[i-1,j], c[i,j-1])    if x[i]!=y[j]

    使用 b[i,j] 表示三种情况(=1,=2,=3),方便以后输出LCS:

    if b[i,j] == 1,表示 x[i] == y[j], 可以输出;

    if b[i,j] == 2,表示 c[i-1,j] > c[i,j-1], i--即可;

    if b[i,j] == 3,表示 c[i,j-1] > c[i-1,j], j--即可;

源代码:

 1 /*
 2 OJ: TOJ
 3 ID: 3013216109
 4 TASK: 1139.Compromise
 5 LANG: C++
 6 NOTE: LCS(DP)
 7 */
 8 #include <iostream>
 9 #include <cstring>
10 using namespace std;
11
12 int main()
13 {
14     char x[105][31],y[105][31],ans[105][31];
15     int c[105][105],b[105][105];
16     int i,j,k,m,n;
17     while(cin >> x[1]) {
18         for(i=2;;i++) {
19             cin >> x[i];
20             if(x[i][0]==‘#‘)break;
21         }
22         for(j=1;;j++) {
23             cin >> y[j];
24             if(y[j][0]==‘#‘)break;
25         }
26         m=i-1; n=j-1;
27         for(i=0;i<=m;i++)
28             c[i][0]=0;
29         for(i=1;i<=n;i++)
30             c[0][i]=0;
31         for(i=1;i<=m;i++) {
32             for(j=1;j<=n;j++) {
33                 if(!strcmp(x[i],y[j])) {
34                     c[i][j]=c[i-1][j-1]+1;
35                     b[i][j]=1;
36                 }
37                 else if(c[i-1][j]>=c[i][j-1]) {
38                     c[i][j]=c[i-1][j];
39                     b[i][j]=2;
40                 }
41                 else {
42                     c[i][j]=c[i][j-1];
43                     b[i][j]=3;
44                 }
45             }
46         }
47         i=m;j=n;
48         k=c[m][n]-1;
49         while(i>0&&j>0&&k>=0) {
50             if(b[i][j]==1) {
51                 strcpy(ans[k],x[i]);
52                 i--;j--;k--;
53             }
54             else if(b[i][j]==2) i--;
55             else if(b[i][j]==3) j--;
56             else break;
57         }
58         for(i=0;i<c[m][n]-1;i++)
59             cout << ans[i] <<" ";
60         cout <<ans[c[m][n]-1]<<endl;
61     }
62     return 0;
63 }
时间: 2024-12-22 00:22:10

TOJ 1139.Compromise的相关文章

1139: 零起点学算法46——求最小值

1139: 零起点学算法46--求最小值 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1399  Accepted: 879[Submit][Status][Web Board] Description 输入一些整数,求最小值 Input 多组测试数据 首先输入1个整数n表示测试组数 然后每行首先输入1个整数m,再输入m个整数 Output 对于每组测试数据输出1行,内容为m个整数的最小值 Sa

1139 约瑟夫环问题

1139 约瑟夫环问题 时间限制:500MS  内存限制:65536K提交次数:157 通过次数:79 题型: 编程题   语言: G++;GCC Description 约瑟夫(josephus)环是这样的:假设有n个小孩围坐成一个圆圈,并从1开始依次给每个小孩编上号码.老师指定从第s位小孩起从1开始报数,当数到m时,对应的小孩出列,依次重复,问最后留下的小孩是第几个小孩?例如:总共有6个小孩,围成一圈,从第一个小孩开始,每次数2个小孩,则游戏情况如下: 小孩序号:1,2,3,4,5,6 离开

TOJ 2850 Corn Fields 状压dp

Source: http://acm.tju.edu.cn/toj/showp.php?pid=2850 题意:n*m的土地上种东西,每个位置分为可以种和不能,种的方案要求不能相邻地种,问合法方案数.(写得有点乱) 分析:做过炮兵阵地,这题就是秒杀了. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int mo = 1000000

TOJ 2294 POJ 3286 How many 0&#39;s? 数位dp

http://acm.tju.edu.cn/toj/showp2294.html http://poj.org/problem?id=3284 题外话:集训结束,回学校了.在宿舍看了这题,没什么好想法,去洗澡了.转了两个澡堂都特么没开..倒是在路上把这题想了.用回自己的电脑,不得不说苹果的字体渲染,真心高一个等级. 题意:给定两个数a和b,从a写到b,问一共写了多少个0. 分析:当然先转化为求0..a写多少个0.网上有更简单的做法,就是枚举每位作为0,则如果这一位本来是0,左边取1..a-1(不

POJ 2250 Compromise (DP,最长公共子序列)

Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6440 Accepted: 2882 Special Judge Description In a few months the European Currency Union will become a reality. However, to join the club, the Maastricht criteria must be fulfille

TOJ 4105 Lines Counting(离线树状数组)

4105.   Lines Counting Time Limit: 2.0 Seconds   Memory Limit: 150000K Total Runs: 152   Accepted Runs: 47 On the number axis, there are N lines. The two endpoints L and R of each line are integer. Give you M queries, each query contains two interval

TOJ刷题记录(2/50)

P1172:二分,最大化最小值 1 #include <algorithm> 2 #include <bitset> 3 #include <cctype> 4 #include <complex> 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 #include <map> 9 #include <queue> 10

POJ2250:Compromise(LCS) 解题心得

原题: Description In a few months the European Currency Union will become a reality. However, to join the club, the Maastricht criteria must be fulfilled, and this is not a trivial task for the countries (maybe except for Luxembourg). To enforce that G

POJ 2250 Compromise (线性dp LCS +递归路径)

Compromise Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6735   Accepted: 3009   Special Judge Description In a few months the European Currency Union will become a reality. However, to join the club, the Maastricht criteria must be fu