码迷,mamicode.com
首页 > 其他好文 > 详细

9-8

时间:2016-09-02 18:40:47      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

如题目讲解中所说,在计算过程中并不关心每个颜色的L(c),关心的是所有L(c)的sum值。

d[i][j]表示两个序列分别移走了i和j个元素之后,此时合并的序列序列中L(c)的sum值,题目的答案是d[n][m]。

d[0][0] == 0

c[i][j] 表示两个序列分别移走了i和j个元素之后,此时合并的序列中有多少个已经开始但尚未结束的字母。

c[0][0] == 0

代码中用两层for循环分别遍历两个序列

如果 i > 0,从第一个序列中移走i个元素,

d[i-1][j]表示从

   

      // 如果q[j]在q中只有一个,而且q[j]没在p中出现

     // 那么 sq[q[j]] == j == eq[q[j]],而且 sp[q[j]] == INF, ep[q[j]] == 0

     // 下面两个if条件都成立,c[i][j]加一再减一,保持不变,

     // sp数组初始值为INF,ep数组初始值为0

     if (sq[q[j]] == j && sp[q[j]] > i) c[i][j]++; 

     if (eq[q[j]] == j && ep[q[j]] <= i) c[i][j]--;

 

d[i][j] = min{d[i-1][j] + c[i-1][j], d[i][j-1] + c[i][j-1]}

d[i][j]不能算是原问题的子问题,因为在计算d[i][j]的公式中,c[i-1][j]或c[i][j-1]的值是根据sp[],ep[],sq[],eq[]计算的,而这几个数组是对原始的两个序列分析而得到的,

并不是对序列1的前i个字符和序列2的前j个字符分析而得到的。

 

9-8

标签:

原文地址:http://www.cnblogs.com/patrickzhou/p/5834356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!