您的位置:首页 > 其它

写个关于lcs模板的问题

2016-04-28 09:15 225 查看
        for( int i = 1; i <= len1; ++i )

        {

             for( int j = 1; j <= len2; ++j )

           {

               if( s1[i] == s2[j] )

               {

                   dp[i][j] = dp[i-1][j-1] + 1;

               }

                else

                {

                    dp[i][j] = Max ( dp[i-1][j], dp[i][j-1] );                        、、关于这个模板  看了好久 想整理 一下思路 方便以后用 

               }

             }
  最大子序列的问题 

这个模板 把所有初值 都赋值为0 从第一个开始找到第一个与他相等的位置 (为了这个模拟运行了好多次) 如果不相等 就每次留下 他前面最大相同的子序列

比如 1 3 3 2 4

          2 1 3  4 1 

这个 模拟运行一下  从1 开始 上来 1!=2 所以 dp【1】【1】的值应该保留为 dp【i-1】【j】   dp【i】【j-1】的最大值 都是0 这可能看不出来 

下面 继续模拟

当一等于 一的时候   dp【1】【2】 等于dp【0】【1】+1 这样子是用上面的最大子序列长度 加上他的;

继续  当1!=3的时候 这个时候  dp【1】【3】 需要保留dp【1】【2】的值 或者dp【0】【3】的值很明显dp【1】【2】才是判断到这里的最大值;

一直到 dp【1】【4】都是保留的 dp【1】【2】的值

目前 dp【1】【】值分别为 0 1 1 1 1 ;

在进行下一个 

dp【2】【1】 值为0 以为dp【1】【1】 dp【2】【0】为0;

一直到dp 【2】【3】 保留的是dp【1】【2】加1 

在这之前dp【2】【2】一直保留了之前的最大长度 

一直循环到最后 保留的肯定是最大值

我很看好

在出现相同子串的时候 会将不同值给分开 。

相出这个dp 的一定 很 66 ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: