今天看了一晚上书,始终没能弄明白最长增长公共子序列用动态规划算法的实现。
书中意思是,根据输入的数组建立dag,存储形式为邻接表的逆表(即后继结点的指针指向前驱结点)。当时百思不得其解,有没有必要建立的dag。
后来上网搜了一下,发现其实dag只是用来辅助理解的,而我竟然将其理解为要真实建立以个dag。
反思:算法思想还是很肤浅,没有真正领悟DP思想。
附源码:
#include <stdio.h> #include <dos.h> #define N 8 int main() { int num[N] = {1, 2, 3, 4, 5, 6, 7, 8}; int max[N] = {1}; int i; int j; int MaxCount = 1; for (i = 1; i < N; i++) { for (j = 0; j < i; j++) { if (num[i] > num[j] && max[i] >= max[j]) max[i] = max[j] + 1; } } for (i = 0; i < N; i++) { if (max[i] > MaxCount) MaxCount = max[i]; } printf("/n%d", MaxCount); return 0; }