最长公共上升子序列 (dp)
来源:互联网 发布:手机淘宝抢购软件 编辑:程序博客网 时间:2024/05/01 04:34
http://wenku.baidu.com/view/3e78f223aaea998fcc220ea0.html
(1)f[i][j] 表示 a的前i,和b串前 j,以b[j]结尾的LCIS的长度;
if(a[i]!=b[j) f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][k]+1) 1<=k<j&&b[k]<b[j];
O(n^3)的复杂度,因为多了一维k,但f[i-1][k]的最大值显然可以在处理i-1的时候求出来
for(i=1;i<=n;i++)
maxn=0;
for(j=1;j<=m;j++)
f[i][j]=f[i-1][j];
if(a[i]>b[j]&&maxn<f[i-1][j]) maxn=f[i-1][j];
if(a[i]==b[j]) f[i][j]=maxn+1;
最后扫一遍f[n][1......m] ,取最大值。
(2)压缩空间,时间不变:
用f[j]表示 所有的a[i]和b的前j个,以b[j]结尾的LCIS的长度。
注意到(1)中, if(a[i]>b[j]&&maxn<f[i-1][j]) maxn=f[i-1][j]; 我们取得其实是f[1..i-1][j]的最大值,那不就是f[j]吗?
int f[N];
int a[M],b[N];
memset(f,0,sizeof(f));
for(i=1;i<=M;i++)
maxn=0;
for(j=1;j<=N;j++)
if(a[i]>b[j]&&maxn<f[j]) maxn=f[j];
if(a[i]==b[j]) f[j]=maxn+1;
最后扫一遍f[1......N];
- 最长公共上升子序列 (dp)
- 最长公共上升子序列(dp)
- [DP]最长公共上升子序列LCIS
- 【hdu1423】【DP】最长公共上升子序列
- [CODEVS2185]最长公共上升子序列(dp)
- code 2185 最长公共上升子序列 (dp)
- #10 D. LCIS (dp+最长公共上升子序列)
- 最长公共上升子序列(LIS)
- 最长上升公共子序列(LCIS)
- HDU1423(最长上升公共子序列)
- HDU5904LCIS(最长公共上升子序列)
- Virus (最长上升公共子序列)
- 最长公共上升子序列
- 最长公共上升子序列
- 最长上升公共子序列
- 最长公共上升子序列
- 最长公共上升子序列
- 最长公共上升子序列
- linux read 用法
- Get和Post的区别
- 泛型
- Google Map 根据经纬度获取当前具体街道位置
- 开学后的第一次总结
- 最长公共上升子序列 (dp)
- MYSQL关于INSERT操作主键冲突的几个解决方案
- 指针和引用可以用来使函数返回多个值
- Camshift
- Android 天气预报2
- 腾讯马拉松编程大赛第0,1,5场解题报告
- 什么是SDK
- Winform窗体传值的几种方式(属性赋值,委托,事件)
- 顺移加密