本文共 1439 字,大约阅读时间需要 4 分钟。
动态规划(DP)是一种解决最优化问题的方法,尤其适用于包含重叠子问题的场景。其核心思想是将复杂问题分解为更简单的子问题,通过记录子问题的解并合并,最终得到原问题的解。
LCS问题与LIS(Largest Incremental Sub-sequence)类似。通过对原字符串排序可以转换为求两个字符串的LCS。
void lcs2(char *first, int lfirst, char *second, int lsecond) { int *dir = new int[lfirst * lsecond]; int *dis = new int[lfirst * lsecond]; for(int i = 0; i < lfirst; i++) { dis[i] = 0; for(int j = 1; j < lfirst; j++) { dis[j * lfirst] = 0; } for(int j = 1; j < lsecond; j++) { if(first[i] == second[j]) { dis[i + j * lfirst] = dis[(i-1) + (j-1)*lfirst] + 1; dir[i + j * lfirst] = 0; } else if(dis[i + (j-1)*lfirst] > dis[(i-1) + j * lfirst]) { dis[i + j * lfirst] = dis[i + (j-1)*lfirst]; dir[i + j * lfirst] = 2; } else { dis[i + j * lfirst] = dis[(i-1) + j * lfirst]; dir[i + j * lfirst] = 1; } } } showLCS(first, dir, lfirst-1, lsecond-1, lfirst); delete[] dir; delete[] dis;} 通过动态规划记录每个子问题的解,并通过表格快速查询,有效解决最优化问题。
转载地址:http://bxhfk.baihongyu.com/