拖了好久的LCIS

f[i][j]表示a串前i个,b串以b[j]结尾的LCIS长度。

转移时考虑a[i]和b[j]是否相等,如果不等:

那么既然是以j结尾,说明a串前i-1位有一个字符和b匹配了,所以由f[i-1][j]转移来(i-1涵盖所有方案)

如果相等,那么考虑由什么转移来

f[i-1][k]是一个前驱状态,既然a[i]匹配了,就只能考虑前i-1位了,由于定义如此,所以可以“笼统地”从f[i-1][]转移来,第二维就得枚举j前面的k,且b[k]<b[j],满足递增性质

这样做是O(n^3)的复杂度,考虑优化一下。

对于一个相等的状态,这里O(n)的转移就是优化的瓶颈了,看看怎么做。

f[i][j]只能从f[i-1][k]转移来,k还得小于j,所以可以一边循环j一边用mx记录f[i][1~j-1]的最大值,前提是b[j]>a[i]。

这样转移就可以写成f[i][j]=mx+1了,O(n^2)的复杂度。

第一维可以像01背包一样压下来,空间O(n)

#include<iostream>
#include<cstdio> using namespace std; const int MAXN=; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} int n;
int a[MAXN],b[MAXN]; int f[MAXN][MAXN]; int main(){
n=rd();
for(int i=;i<=n;i++) a[i]=rd();
for(int i=;i<=n;i++) b[i]=rd();
for(int i=;i<=n;i++){
int mx=;
for(int j=;j<=n;j++){
if(a[i]>b[j]) mx=max(mx,f[i-][j]);
if(a[i]!=b[j]){
f[i][j]=f[i-][j];
continue;
}
if(a[i]==b[j]) f[i][j]=mx+;
}
}
int ans=;
for(int i=;i<=n;i++) ans=max(ans,f[n][i]);
cout<<ans; return ;
}

[JOYOI] 1071 LCIS的更多相关文章

  1. [tyvj 1071] LCIS

    题目描述 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了. 小沐沐说,对于两个串A,B,如果它们 ...

  2. BestCoder Round #87 1003 LCIS[序列DP]

    LCIS  Accepts: 109  Submissions: 775  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: 65536/65 ...

  3. LCIS(最长公共上升子序列)Vijos1264神秘的咒语

    描述 身为拜月教的高级间谍,你的任务总是逼迫你出生入死.比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底. 据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语.为了习得这些法 ...

  4. ural 1071. Nikifor 2

    1071. Nikifor 2 Time limit: 1.0 secondMemory limit: 64 MB Nikifor has a number x. He doesn't need it ...

  5. 最长公共上升子序列(LCIS)

    最长公共上升子序列慕名而知是两个字符串a,b的最长公共递增序列,不一定非得是连续的.刚开始看到的时候想的是先用求最长公共子序列,然后再从其中找到最长递增子序列,可是仔细想一想觉得这样有点不妥,然后从网 ...

  6. hdu-5904 LCIS(水题)

    题目链接: LCIS Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. LCIS HDOJ 4512 吉哥系列故事——完美队形I

    题目传送门 题意:中文题面 分析:LCIS应用:设置b[]为a[]的反转,然后LCIS,若相等的是自己本身,则+1, 否则+2 代码: #include <cstdio> #include ...

  8. LCIS POJ 2172 Greatest Common Increasing Subsequence

    题目传送门 题意:LCIS(Longest Common Increasing Subsequence) 最长公共上升子序列 分析:a[i] != b[j]: dp[i][j] = dp[i-1][j ...

  9. LIS+LCS+LCIS

    PS:本篇博文均采用宏#define FOR(i, a, n) for(i = a; i <= n; ++i) LIS:最长上升子序列 废话不多说:http://baike.baidu.com/ ...

随机推荐

  1. gets,gets_s,fgets函数

    这次就说一下,gets(),gets_s(),fgets(),::::[在某一篇博客上看到的] C的标准库gets函数不对接受字符串的buffer进行边界检测,会造成越界,从而产生bug: fgets ...

  2. hdoj1260【简单DP】

    这题就是一个人买还是两个人买,直接选择一下,而且默认是排好了的,就是DP一下,可能不知道DP的人,也是这么写的吧.DP是一种思想啊. #include <bits/stdc++.h> us ...

  3. 国产spfa瞎几把嗨

    //在各种不利的因素下,我居然就这么水过了这题最短路,然而还wa了一次,因为路是双向的... //这题姿势很多啊,但自从会了国产spfa就是最短路能搞的就是spfa,优点太多了!!! //也是瞎几把打 ...

  4. 分布式集群环境下,如何实现session共享四(部署项目测试)

    这是分布式集群环境下,如何实现session共享系列的第四篇.在上一篇:分布式集群环境下,如何实现session共享三(环境搭建)中,已经准备好了相关的环境:tomcat.nginx.redis.本篇 ...

  5. AtCoder Beginner Contest 057 ABCD题

    A - Remaining Time Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Dol ...

  6. 线段树(单点更新)/树状数组 HDOJ 1166 敌兵布阵

    题目传送门 /* 线段树基本功能:区间值的和,修改某个值 */ #include <cstdio> #include <cstring> #define lson l, m, ...

  7. JavaScript-获取当前元素的相关元素或节点--方法总结

    1.获取当前元素中的第一个子节点 document.getElementById("uu").firstChild 2.获取当前元素中的第一个子元素 document.getEle ...

  8. 维骨力Glucosamine的最关键的几点...

    1.每日劑量應為多少?長期服用安全嗎? 由於葡萄糖胺(Glucosamine)和軟骨素(Chondroitin)原來就存在於人體,是人體每天會生產製造的必需營養素,因此,一般認為服用此類產品的安全性相 ...

  9. css新奇技术及其未来发展

    1.图像替换技术: 图像替换技术是指使用图像替换页面中文本的功能,类似与在页面中插入图像,只是这种方法更为方便,易于代码管理.通常来说,设计者习惯使用有意义的图像去替换一些标题,logo和某些特定的页 ...

  10. D. Black Hills golden jewels 二分答案 + 二分判定

    http://codeforces.com/gym/101064/problem/D 题目是给定一个数组,如果两两组合,有C(n, 2)种结果,(找出第一个大于等于第k大的结果) 思路, 二分答案va ...