博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LICS O(n*m)+前驱路径
阅读量:6586 次
发布时间:2019-06-24

本文共 1880 字,大约阅读时间需要 6 分钟。

LICS:最长公共上升子序列;

一般令f[i][j]表示a串前i位,b串以j结尾的LICS长度。于是,答案为:max(1~m)(f[n][i]);

朴素做法:O(n^3) 相等时,从1~j-1枚举最大值。

for(int i=1;i<=n;i++)  for(int j=1;j<=m;j++)  {
if(a[i]!=b[j]) f[i][j]=f[i-1][j]; else if(a[i]==b[j]) for(int k=1;k

算法时间复杂度改进思路主要从优化第三层(k)复杂度入手。

升级做法: O(n^2logn) 利用树状数组记录f[i-1][1~j-1]最大值; 数组下表记录的是b串数值。 (第一个j循环预处理,并且更新上一次的成果)需要:树状数组和离散化。

int mx[]for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) {mx[j]=query(b[j]-1)//0~b[j]-1 这些数中的f最大值 modify(b[j],f[i-1][j])//将上一轮求出的f尝试更新 } for(int j=1;j<=m;j++)  if(a[i]==b[j]) f[i][j]=mx[j]+1;  else f[i][j]=f[i-1][j]; }

其实这样很麻烦。 复杂度中等,还需要离散化,求具体子序列还要还原。

终极做法:O(n^2) 考虑到,每次进行j循环时,i不动,a[i]的值暂时不变。所以只需边求边记录最大值即可。 直接省掉k层循环。

for(int i=1;i<=n;i++) {  int mx=f[i-1][0];  for(int j=1;j<=m;j++)   if(a[i]!=a[j])    f[i][j]=f[i-1][j]   else     f[i][j]=mx+1;   if(b[j]

poj 2127 至于要求具体子序列时,需要记录使之更新的前驱,即path[i][j]=某个位置bj; 因为是“以j结尾”,所以记录bj。输出时输出b[bj];

详见代码: ai,aj记录使答案成为ans的第一个位置。 故可以直接输出b[aj];

#include
#include
#include
using namespace std;const int N=505;int f[N][N],path[N][N];int mj,mx,sum,ai,aj;int ans[N];int n,m;int a[N],b[N];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) { mx=0; for(int j=1;j<=m;j++) { f[i][j]=f[i-1][j]; path[i][j]=-1; if(b[j]
mx) { mx=f[i-1][j]; mj=j; } else if(a[i]==b[j]) { f[i][j]=mx+1; path[i][j]=mj; } if(sum
-1) { ans[tmp--]=b[aj]; aj=path[ai][aj]; } ai--; } for(int i=1;i<=sum;i++) printf("%d ",ans[i]); return 0;}

纯手打。 参考:

 

转载于:https://www.cnblogs.com/Miracevin/p/9031701.html

你可能感兴趣的文章
java内存模型(netty权威指南)
查看>>
Fragment问题集
查看>>
NSNotificationCenter详解
查看>>
【javascript】浮点数运算问题分析及解决方法
查看>>
TQ2440实现触摸屏和qt图形 解决segmentation fault
查看>>
HBase的JavaAPI使用
查看>>
Debian GNU/kFreeBSD是什么
查看>>
使用base64:url 来定义背景图片url
查看>>
Oracle事务隔离级别
查看>>
PNG文件格式具体解释
查看>>
WebService注解
查看>>
7月目标 socket , 一致性哈希算法 ; mongodb分片; 分布式消息队列; 中间件的使用场景...
查看>>
cocos2dx 3.1从零学习(三)——Touch事件(回调,反向传值)
查看>>
GetParam(name)
查看>>
android PopupWindow实现从底部弹出或滑出选择菜单或窗口
查看>>
(面试必知)必知必会的冒泡排序和快速排序
查看>>
图解iPhone开发新手教程
查看>>
ext2磁盘布局
查看>>
23种设计模式(3):抽象工厂模式
查看>>
【Android】自己定义控件——仿天猫Indicator
查看>>