动态规划之最长公共子序列问题
由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。
用c[i][j]记录序列X和Y的最长公共子序列的长度,其中, Xi={x1,x2,…,xi};Yj={y1,y2,…,yj}。
当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。
故此时C[i][j]=0。其他情况下,由最优子结构性质可建立递归关系如下:
LCSLength只是计算出最优值,并未给出最优解,然而数组b可用于快速构造两个序列的最长公共子序列:
b[i][j]=1时表示Xi和Yj的最长公共子序列是由Xi-1和Yj-1的最长公共子序列加上xi所得到的(斜);
b[i][j]=2时表示Xi和Yj的最长公共子序列是由Xi-1和Yj的最长公共子序列相同(上);
b[i][j]=3时表示Xi和Yj的最长公共子序列是由Xi和Yj-1的最长公共子序列相同。根据b的内容打印出最长公共子序列(左)。
# | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 0 | 1 |
1 |
2 |
2 |
2 | 2 | 2 | 2 | 2 |
3 | 0 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
4 | 0 | 1 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
5 | 0 | 1 | 2 | 3 | 3 | 3 | 3 | 4 | 4 | 4 |
6 | 0 | 1 | 2 | 3 | 4 | 4 | 4 | 4 | 5 | 5 |
长度矩阵c
# | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 3 | 3 | 3 | 1 | 3 | 3 | 3 | 3 |
2 | 0 | 2 | 2 | 1 | 1 | 3 | 1 | 3 | 1 | 1 |
3 | 0 | 2 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
4 | 0 | 2 | 2 | 1 | 1 | 3 | 1 | 3 | 1 | 1 |
5 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 3 | 3 |
6 | 0 | 2 | 2 | 1 | 1 | 3 | 1 | 2 | 1 | 1 |
状态矩阵b