15.4-1 确定<1,0,0,1,0,1,0,1>和<0,1,0,1,1,0,1,1,0>的一个LCS。
1 0 0 1 1 0
15.4-2 说明如何通过表c和原始序列X=
void printLcs2(int c[maxn][maxn], char x[], char y[],int i,int j) {
if (i == 0 || j == 0) return;
if (x[i] == y[j]) {
printLcs2(c,x,y,i-1,j-1);
cout<=c[i][j-1]) { printLcs2(c,x,y,i-1,j); }
else { printLcs2(c,x,y,i,j-1); }
}
15.4-3 请给出一个LCS-LENGTH的运行时间为O(mn)的备忘录版本。
int lcsLength2(char sx[], char sy[], int c[maxn][maxn], int b[maxn][maxn], int i,int j) {
if (c[i][j] != -1) return c[i][j];
if (sx[i] == sy[j]) {
c[i][j] = lcsLength2(sx,sy,c,b,i-1,j-1) + 1;
b[i][j] = LEFTUP;
}
else {
int l=lcsLength2(sx,sy,c,b,i-1,j);
int r=lcsLength2(sx,sy,c,b,i,j-1);
if ( l >= r ) {
c[i][j] = l;
b[i][j] = UP;
}
else {
c[i][j] = r;
b[i][j] = LEFT;
}
}
return c[i][j];
}
15.4-4 说明如何仅用表c中的2·min(m,n)项以及O(1)的额外空间来计算一个LCS的长度。然后说明如何用min(m,n)项以及O(1)的额外空间来做到这一点。
15.4-5 请给出一个O(n^2)时间的算法,使之能找出一个n个数的序列中最长的单调递增子序列。
*15.4-6 请给出一个O(nlgn)时间的算法,使之能找出一个n个数的序列中最长的单调递增子序列。
void LIS(int a[],int f[],int n) {
vectord;
int r;
for (int i=0;i