(开篇必读,我是个菜鸡,所以思考的问题都是属于比较低端的,大佬请直接关闭此页)
说在之前我真的菜,乃至于明显很简单的两道题我写了15个小时左右,我是真的菜,而且我现在很生自己的气。正常人自己手打代码估计是20分钟+20分钟,一个小时就能搞定。为什么花这么久的时间,因为我“探索”了很久,现将问题总结,并期待下一次不要遇到相同的问题。(下面两)
1、lcs最大公共子序列
卜老师介绍了一种算法

我没有拿正常打dp表的方式来做这道题,而采取了老师讲述的那种方法,这就是噩梦的来源。
1、伪代码第二行的理解:
-
matches(k+1)=(m+1,n+1)有k个匹配为什么要搞一个k+1,于是我写代码的时候华丽的忽视了这一句,导致错误。我们需要注意到,matches的添加方式和之后的读取方式,对!一行一行顺序读取,那么我们假设越到最后opt越大(由于每一次都取之前表里的最大值)肯定是递增的,那么最后输出的结果就是opt[l1][l2]。假如bdad和abd那么最后一对是处在3的a和处在1的a,那么最后一个得到的opt的值是1。所以要加一个k+1行的,即统计上面所有的最大值,最后输出的时候k-1即可。
for(int i = 0;i < l1; i++){
for(int j = 0;j < l2; j++){
if (S[i] == T[j]){
matches[matches_index] = make_pair(i,j);
matches_index++;
}

最低0.47元/天 解锁文章
1144





