NOIP提高组 千帆渡
来源:互联网 发布:翅片管换热器设计软件 编辑:程序博客网 时间:2024/05/18 13:23
Description
Data Constraint
Solution
这种题一看就知道是dp。我们设f[i][j]表示在前i个红色船中,当前匹配到的蓝色船为j(意思是前i个红色船中的某一个和j匹配)。那么显然我们分类讨论一下。
当a[i]!=b[j]时,f[i][j]=f[i-1][j]。
当a[i]=b[j]时,f[i][j]=Max(f[i−1][k]) +1(j>k,b[j]>b[k]),那么我们发现这显然是一个O(N3 )的算法。因为a[i]=b[j],于是我们换一下f[i][j]=Max(f[i−1][k]) +1(j>k,a[i]>b[k])那么所有k都只与a[i]有关。我们设g[i][j]=Max(f[i−1][k]) (j>k,a[i]>b[k]),在每次做完f[i][j]后,我们判断b[j]是否大于a[i+1]。满足大于则更新g[i+1][j]的最大值,而且g[i][j]=max(g[i][j],g[i][j-1]),显然。最后记录一下路径。时间复杂度O(N2 )。
代码
#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int maxn=5005;int f[maxn][maxn],g[maxn][maxn],fa[maxn][maxn];int n,i,t,j,k,x,y,m,a[maxn],b[maxn],ans,p,c[maxn];int main(){// freopen("data.in","r",stdin);freopen("data.out","w",stdout); scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); for (i=1;i<=m;i++) scanf("%d",&b[i]); for (i=1;i<=n;i++) for (j=1;j<=m;j++){ if (a[i]==b[j]){ f[i][j]=f[i-1][g[i][j]]+1; fa[i][j]=g[i][j]; if (f[i][j]>ans) p=i*maxn+j; ans=max(ans,f[i][j]); } else f[i][j]=f[i-1][j],fa[i][j]=j; g[i+1][j]=g[i+1][j-1]; if (b[j]<a[i+1] && f[i][g[i+1][j]]<f[i][j]) g[i+1][j]=j; } printf("%d\n",ans);t=0; x=p/maxn; y=p%maxn; while (x){ t=fa[x][y]; if (f[x][y]!=f[x-1][t]) c[++c[0]]=a[x]; y=t;x--; } for (i=c[0];i>0;i--) printf("%d ",c[i]);}
3 0
- NOIP提高组 千帆渡
- NOIP提高组 单峰
- NOIP提高组 积木
- NOIP提高组 看电影
- NOIP提高组 鼎纹
- NOIP提高组 Brothers
- NOIP提高组 Crisis
- NOIP提高组 Word
- NOIP提高组 闭门造车
- NOIP提高组 爬山
- 【NOIP提高组】爬山
- 【NOIP提高组】Map
- 【NOIP提高组】矩阵
- 【NOIP提高组】整除
- 【NOIP提高组】神炎皇
- 【NOIP提高组】降雷皇
- 【NOIP提高组】幻魔皇
- 【NOIP提高组】B
- FusionCharts在Java中的基本使用!
- iOS 开发 RGB 色值转换
- 关于集成开发环境eclipse
- ActiveMQ高级特性:虚拟Destinations实现消费者分组与简单路由
- 雅虎面试题-你真的了解HTML吗?
- NOIP提高组 千帆渡
- 并行编译 Xoreax IncrediBuild
- mysql存储过程例子cursor
- const char * 和 char const * 和 char * const 区别
- Mysql主从配置
- centos安装mysql
- Python学习笔记——前言
- bzoj 3781: 小B的询问
- 安装lnmp lamp lnamp环境