最长公共递增子序列算法简介
其实根本不用后面的折腾,只需要这样:
整 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的话,后面是没法改变的.前面不变,后面根本就没变.
参考地址
参考地址
参考地址
参考地址
这里
这里
这里
这里
这里
浙公网安备 33010602011771号