最长公共上升子序列(dp)
2017-08-07 19:37
309 查看
题目:
我是超链接
题解:
讲解
最开始的状态:f[i][j]表示a数组的第i项和b数组的第j项结尾为b[j]的最大长度,转移:f[i][j]=f[i-1][j] (a[i]!=b[j])max{f[i-1][k]+1} (a[i]==b[j],i<=k<j,b[j]>b[k])
这样的效率是n^3的,枚举最大值的循环怎么看都可以去掉,我们可以优化:观察第二个式子,发现a[i]>b[k]的时候起作用,那我们可以在遍历第二个数组的时候“顺便”把比a[i]小的b[j]的f取一个最大值,这样就不用枚举最大值了
n^2是合格了,空间可不可以更优呢?发现f只和上一个有关,可以运用滚动数组,也可以直接去掉了啊
代码:
不用输出例子的:
需要输出例子的
一般字符串的dp设计状态都是f[i][j]表示A串匹配到i,B串匹配到j,枚举匹配好的长度,带权什么的初值就不要赋成INF
我是超链接
题解:
讲解
最开始的状态:f[i][j]表示a数组的第i项和b数组的第j项结尾为b[j]的最大长度,转移:f[i][j]=f[i-1][j] (a[i]!=b[j])max{f[i-1][k]+1} (a[i]==b[j],i<=k<j,b[j]>b[k])
这样的效率是n^3的,枚举最大值的循环怎么看都可以去掉,我们可以优化:观察第二个式子,发现a[i]>b[k]的时候起作用,那我们可以在遍历第二个数组的时候“顺便”把比a[i]小的b[j]的f取一个最大值,这样就不用枚举最大值了
n^2是合格了,空间可不可以更优呢?发现f只和上一个有关,可以运用滚动数组,也可以直接去掉了啊
代码:
不用输出例子的:
#include <cstdio> #include <iostream> using namespace std; int a[3005],b[3005],f[3005]; int main() { int n,i,j; scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",&a[i]); for (i=1;i<=n;i++) scanf("%d",&b[i]); int maxx; for (i=1;i<=n;i++) { maxx=0; for (j=1;j<=n;j++) { if (a[i]>b[j]) maxx=max(maxx,f[j]); if (a[i]==b[j]) f[j]=maxx+1; } } for (i=1;i<=n;i++) maxx=max(maxx,f[i]); printf("%d",maxx); }
需要输出例子的
#include <cstdio> #include <iostream> #include <vector> #define INF 1e9 using namespace std; struct nod { int val; vector<int>v; }f[505]; int a[505],b[505]; int main() { int n,m,i,j; scanf("%d",&m); for (i=1;i<=m;i++) scanf("%d",&a[i]); scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",&b[i]); for (i=1;i<=n;i++) { nod k;k.val=0; for (j=1;j<=m;j++){ if (b[i]>a[j] && k.val<f[j].val) k=f[j]; if (b[i]==a[j]) { f[j].val=k.val+1; f[j].v=k.v; f[j].v.push_back(b[i]); }} } nod Max = f[1]; for (int i=2;i<=m;i++) if (f[i].val>Max.val) Max = f[i]; printf("%d\n",Max.val); for (int i =0; i < Max.v.size(); i++) printf("%d ",Max.v[i]); printf("\n"); }
一般字符串的dp设计状态都是f[i][j]表示A串匹配到i,B串匹配到j,枚举匹配好的长度,带权什么的初值就不要赋成INF
相关文章推荐
- CODE[VS] 最长公共上升子序列(LCIS)(序列型DP)
- Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp
- [CODEVS2185]最长公共上升子序列(dp)
- #10 D. LCIS (dp+最长公共上升子序列)
- 【hdu1423】【DP】最长公共上升子序列
- 最长公共上升子序列的DP解法及其优化
- UVA12511 - Virus(DP+最长公共上升子序列)
- 最长公共上升子序列的DP解法及其优化
- poj 2127 Greatest Common Increasing Subsequence(最长公共上升子序列dp)
- hdu 1423 Greatest Common Increasing Subsequence(最长公共上升子序列dp)
- 最长公共上升子序列的DP解法及其优化
- hdu 1423 dp 求最长公共上升子序列
- [DP]最长公共上升子序列LCIS
- hdu 1423 Greatest Common Increasing Subsequence(DP 最长公共上升子序列)
- hdu 1423 Greatest Common Increasing Subsequence(DP 最长公共上升子序列)
- [CodeVS 2185] 最长公共上升子序列:DP
- 动态规划(DP)之最长上升子序列问题
- 最长公共上升子序列——hdu1423 Greatest Common Increasing Subsequence
- hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列
- UVA 12511/CSU 1120 virus 最长公共上升子序列