0001 extern uint32_t** M; //(n+1)*(m+1)的二维快查表:第0行、第0列已初始化为0,其余为UINT_MAX 0002 uint32_t lcsM(const char* A, int n, const char* B, int m) { //记忆化版:O(n*m) 0003 if (UINT_MAX == M[n][m]) //每个子问题只会在第一次求值时,才需照常递归计算 0004 M[n][m] = (A[n-1] == B[m-1]) ? 0005 lcsM(A, n-1, B, m-1) + 1 : 0006 max(lcsM(A, n-1, B, m), lcsM(A, n, B, m-1)); 0007 return M[n][m]; //否则,可以直接引用快查表 0008 } //lcsM:既然递归基的答案已经预存,故可省去对应的判断