如:a: 1 0 2 3 -1 3 4 0 6 7 -3 6
b: -1 3 0 2 3 9 -1 3 4 0 6 7
输出:-1 3 4 0 6 7
//先说一下这个题目的思路:
/因为要输出这两个序列的最长公共子序列,所以我么必须找到这个公共子序列分别在两个数组中的的位置,又或者是对其中一个序列进行“排序”, 使这个公共部分在两个数组中的位置相同/
#include <iostream> using namespace std;
int main() {
int a[12] = { 1,0,2,3,-1,3,4,0,6,7,-3,6 };
int b[12] = { -1,3,0,2,3,9,-1,3,4,0,6,7 };
int i, k, c, d, x, max, temp;
x = max = 0;
for (i = 0; i < 12; i++) {
for (k = 0; k < 12; k++) {
if (a[k] == b[k]) { //找a数组的某一位置的值是否和b数组的值相同,相同就记录一次
x++;
}
else { // 不满足时跳出
if (x > max) { // 判断最大长度的那个公共子序列
max = x ;
c = k; // 并且把这个末位置赋给c;
}
x = 0;
}
}
// 对数组a进行类似与排序的操作,用后一项挤掉前一项,使这个公共最长序列在两个数组中处于相同位置
for (d = 0; d < 11; d++) {
temp = a[0];
a[d] = a[d + 1];
a[11] = temp;
}
}
cout << "最长共有序列为:";
for (i = c-max ; i < c+1 ; i++) {
cout << b[i] << " "; // 输出最长的公共子序列
}
return 0;
}