先得理解最长上升子序列吧,这还是非常简单的。
然后就是要真正理解LCS;
真正理解源于做题,做题就像查漏补缺一样,你总有不会的地方。
非常彻底地理解该图(还是去做题啦)
= =瞎几把乱说有两种问题
【完全的求一个最长公共子序列】
(非常彻底地理解路径或者说是状态转移的规律)
先是初始化
付一个0的dp数组,把dp作为一个介体达到一种最长公共子序列的目的
然后就开始更新dp的值,dp的状态转移方程OK,然后根据状态转移方程,
可以很清楚地知道,路径的变化就是状态转移变化的方向。
【这样就可以实现路径的初始模型】
【详细阐述路径】
就是标记啊,因为LCS问题上面,状态转移只有三种,向下,向右,还有右下,然后就是搞三个标记,在竖直方向上移动的话就是-1,在水平方向上移动的话就是1,然后如果满足了相等,要斜对角移动的话就是0,然后递归进行输出。
【反着的一个题目(拓展)】
另一个问题就是给你两个序列,再给你一个序列,然后问你前面两个序列能否组成被给的第三个序列。
DP求解:定义dp[i][j]表示A中前i个字符与B中前j个字符是否能组成C中的前 (i+j) 个字符,如果能标记true,如果不能标记false;
满足什么状态可以转变成什么状态;
可做的题(先去做求最大长度的练练手,然后理解路径,就可以做输出的题了):Hdoj3779,hdoj1501,poj2192,poj2250
【不会就去学,不要贴代码,思路最重要】