最长公共递增子序列算法简介

其实根本不用后面的折腾,只需要这样:

        整 i=-1,j=0;h=0;//h为全局变量(&t:){//从0开始.表示自身位置.
            i++;动 p=.查找(t);(p==.());
            j=选小(p->第二);(j==-1);(,j,i);h=j+1;//我的>=下一个吧.
        }//选小,选最小>=h,只在这压,因而h就是上个

就可以了,而且算法是(N)复杂度,根本没有(N*logn),甚至M*N的复杂度.后面的参考代码等都可以不看了.直接用上面的算法就可以了.

f[1][1] = same(1,1);
f[i,j] = max{f[i-1][j -1] + same(i,j),f[i-1,j],f[i,j-1]};

参考地址实现
参考地址理念

c[i-1][j-1],c[i-1][j],c[i][j-1]
//计算当前行,与上一行.
c[i%2][j]=c[(i-1)%2][j-1]+1;
c[i%2][j]=最大(c[i%2][j-1],c[(i-1)%2][j]);
//上一行(i-1,j-1),相邻项的值.3个值.
//要更新时.
c[i-1][j]=当前c[j]//c[j]==c[上个][j]
c[i][j-1]=c[j-1]//c[j-1]=c[当前][j-1],j-1表列
c[i-1][j-1]=临时//放在临时里面.

c[当前][j]=c[上行][j-1]+1;//或下面,临时变量搞定
c[当前][j]=最大(c[当前][j-1],c[上行][j]);
//这里当前就是当前行.上行,当前的c[j]即c[上行][j]
//当前的c[j-1]即c[当前][j-1].
//把原本上下两行表示的数据合并为一行了.
c[当前][j]=最大(c[当前][j-1],c[上行][j]);
//只看这一行,(a,(b),c),像下面这样,两行合为一行了:
//  这  这
//这  这  这
//这这这这这

参考地址

观察实现:

int pre = 0;
    vector<int> c(m + 1);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            int tmp = c[j];
            if (X[j - 1] == Y[i - 1]) {
                c[j] = pre + 1;
            }
            else {
                c[j] = my_max(c[j - 1], c[j]);
            }
            pre = tmp;
        }
    }

可以看见,假如前面的==为0的话,后面是没法改变的.前面不变,后面根本就没变.
参考地址
参考地址
参考地址
参考地址
这里
这里
这里
这里
这里

posted @ 2020-12-08 17:41  zjh6  阅读(15)  评论(0)    收藏  举报  来源