是一道要记录公共子序列内容的DP。
状态转移方程部分:
for(int i=1; i<=len1; i++) { for(int j=1; j<=len2; j++) { if(!strcmp(str1[i],str2[j])) { f[i][j]=f[i-1][j-1]+1; } else { f[i][j]=max(f[i-1][j],f[i][j-1]); } } }
前半部分先是正常的DP,输出时要倒过来进行判断。
int i=len1; int j=len2; int k=0; while (i >= 1 && j >=1) { if ((f[i][j] == f[i-1][j-1] +1)&&(f[i][j] != f[i-1][j])&&(f[i][j] != f[i][j-1])) { strcpy(record[k++],str1[i]); i--; j--; } else if (f[i][j] == f[i-1][j]) i--; else if (f[i][j] == f[i][j-1])j--; } k--; while(k>=1) //输出的时候一定要小心~!~!~!注意空格,回车 { printf("%s ",record[k]); k--; }
通过if判断出每一个状态f[i][j]是从哪一个状态转移过来的,如果是从f[i-1][j-1]转移过来的话,则说明这里str1[i]==str2[j],是公共的。用一个二维字符数组记录下这一公共的字符串。
最后,再将record倒序输出。
这题被卡了很久主要是输出时的空格和换行没处理好。貌似是在最后一个单词后面多输出了一个空格。。要细心啊~