BZOJ4275 : [ONTAK2015]Badania naukowe
2015-09-30 15:51
316 查看
设f[i][j]为a[1..i]与b[1..j]的LCS,g[i][j]为a[i..n]与b[j..m]的LCS。
若C为0,则ans=f
[m]。
否则求出d[i]=a中从i开始往右匹配上c串的位置以及e[i]=b中从i开始往右匹配上c串的位置。
则ans=max(f[i-1][j-1]+g[d[i]+1][e[j]+1]+C)。
时间复杂度$O(n^2)$。
若C为0,则ans=f
[m]。
否则求出d[i]=a中从i开始往右匹配上c串的位置以及e[i]=b中从i开始往右匹配上c串的位置。
则ans=max(f[i-1][j-1]+g[d[i]+1][e[j]+1]+C)。
时间复杂度$O(n^2)$。
#include<cstdio> #define N 3010 int n,m,C,i,j,k,a ,b ,c ,f ,g ,d ,e ,ans=-1; inline int max(int a,int b){return a>b?a:b;} int main(){ for(scanf("%d",&n),i=1;i<=n;i++)scanf("%d",&a[i]); for(scanf("%d",&m),i=1;i<=m;i++)scanf("%d",&b[i]); for(scanf("%d",&C),i=1;i<=C;i++)scanf("%d",&c[i]); for(i=1;i<=n;i++)for(j=1;j<=m;j++)f[i][j]=a[i]==b[j]?(f[i-1][j-1]+1):max(f[i-1][j],f[i][j-1]); if(!C)return printf("%d",f [m]),0; for(i=n;i;i--)for(j=m;j;j--)g[i][j]=a[i]==b[j]?(g[i+1][j+1]+1):max(g[i+1][j],g[i][j+1]); for(i=1;i<=n;i++)for(j=i,k=1;j<=n;j++){ if(a[j]==c[k])k++; if(k>C){d[i]=j;break;} } for(i=1;i<=m;i++)for(j=i,k=1;j<=m;j++){ if(b[j]==c[k])k++; if(k>C){e[i]=j;break;} } for(i=1;i<=n;i++)if(d[i])for(j=1;j<=m;j++)if(e[j])ans=max(ans,f[i-1][j-1]+g[d[i]+1][e[j]+1]+C); return printf("%d",ans),0; }
相关文章推荐
- Android中内容观察者的使用---- ContentObserver类详解
- SSH框架分析之struts深入分析
- supervisord安装,启动/关闭,添加开机自启动服务
- linux python3.4获取股票脚本
- 初试Jni & NDK
- Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题
- DJANGO基础学习之request对象和response对象
- Android环境搭建Appium测试框架 Python
- Linux date命令的用法
- 如何判断ios设备类型
- poj2759(单点更新)
- Java 内部类相关
- qt model 与 view 的数据显示
- linux c获取股票脚本
- elasticsearch批量删除(查询删除)
- Android中的复制粘贴
- js获得表格多行数据(多选框)
- 用set实现大顶堆
- javase---Java反射操作
- iOS中关于属性@property和@synthesize的问题: