写个关于lcs模板的问题


        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 ;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值