题意:找出两段话连续最长的单词组主要学习如何输出,就是把I,J用计算方法记录下来,然后的话所有被跳过的单词都是这个值,也就是说,这个算出来的IJ减一的话是上一个找到的单词的位置
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
char w1[105][32];
char w2[105][32];
int dp[105][105];
int f[105][105];
int num1, num2;
void print(int s, int flag) {
int a=s/1000;
int b=s%1000;
if(a && b) {
print(f[a-1][b-1], 1);
printf("%s", w1[a-1]);
if(flag) printf(" ");
}
}
int main() {
int i,j;
while(cin>>w1[0]) {
num1=1,num2=0;
if(strcmp(w1[0],"#")) {
while(cin>>w1[num1] && strcmp(w1[num1],"#")) {
num1++;
}
}
else num1=0;
while(cin>>w2[num2] && strcmp(w2[num2],"#")) {
num2++;
}
memset(dp, 0, sizeof(dp));
memset(f, 0, sizeof(f));
for(i=1; i<=num1; i++)
for(j=1; j<=num2; j++) {
if(strcmp(w1[i-1],w2[j-1])==0) {
dp[i][j] = dp[i-1][j-1]+1;
f[i][j] = i*1000+j;
}
else if(dp[i-1][j]<dp[i][j-1]) {
dp[i][j] = dp[i][j-1];
f[i][j] = f[i][j-1];
}
else {
dp[i][j] = dp[i-1][j];
f[i][j] = f[i-1][j];
}
}
if(f[num1][num2]) {
print(f[num1][num2],0);
}
printf("\n");
}
return 0;
}