这题一开始把我给坑了,我还没知道LCIS的算法,然后就慢慢搞吧,幸运的是还真写出来了,只不过麻烦了一点。

我是将该题转换为多条线段相交,然后找出最多多少条不相交,并且其数值死递增的。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[][];
int list1[],list2[];
struct Edge{
int val,vex[];
int pos;
}p[];
void init()
{
int i,j;
for(i=;i<=;i++)
for(j=;j<=;j++)
dp[i][j]=;
for(i=;i<=;i++)
p[i].pos=;
} int main()
{
int t,n,m,i,j,k,r,f;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&list1[i]);
scanf("%d",&m);
for(i=;i<=m;i++)
scanf("%d",&list2[i]);
int f=;
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
if(list1[i]==list2[j])
{
p[i].val=list1[i];
p[i].vex[p[i].pos++]=j;
f=;
}
}
}
/*for(i=1;i<=n;i++)
{
cout<<" ** "<<p[i].val<<" ** :";
for(j=0;j<p[i].pos;j++)
cout<<p[i].vex[j]<<" ";
cout<<endl;
}*/
int Max=;
if(f)
Max=;
for(i=;i<=n;i++)
{
for(j=;j<i;j++)
{
if(p[i].val>p[j].val)
{
//cout<<"ok"<<endl;
//cout<<p[i].val<<" "<<p[j].val<<endl;
for(k=;k<p[i].pos;k++)
{
for(r=;r<p[j].pos;r++)
{
if(p[i].vex[k]>p[j].vex[r])
dp[i][p[i].vex[k]]=max(dp[i][p[i].vex[k]],dp[j][p[j].vex[r]]+);
if(dp[i][p[i].vex[k]]>Max)
{
Max=dp[i][p[i].vex[k]];
//cout<<Max<<endl;
}
}
}
}
}
}
printf("%d\n",Max);
if(t)
printf("\n");
}
return ;
}

正解的代码有如下两种版本,一种是一维数组,一种二维。思想是一样的。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[][],a[],b[];
int LCIS(int n,int m)
{
int i,j,k,temp;
int ans=;
memset(dp,,sizeof(dp));
for(i=;i<=n;i++)
{
temp=;
for(j=;j<=m;j++)
{
dp[i][j]=dp[i-][j];
if(a[i]==b[j]) dp[i][j]=temp+;
if(a[i]>b[j]&&dp[i-][j]>temp)
temp=dp[i-][j];
if(ans<dp[i][j])
ans=dp[i][j];
}
}
return ans;
}
int main()
{
int t,n,m,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(i=;i<=m;i++)
scanf("%d",&b[i]);
printf("%d\n",LCIS(n,m));
if(t)
printf("\n");
}
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[],a[],b[];
int LCIS(int n,int m)
{
int i,j,k;
memset(f,,sizeof(f));
for(i=;i<=n;i++)
{
k=;
for(j=;j<=m;j++)
{
if(a[i]==b[j])
f[j]=max(f[j],k+);
if(a[i]>b[j]&&f[j]>k)
k=f[j];
//cout<<k<<endl;
}
}
int ans=;
for(i=;i<=m;i++)
ans=max(ans,f[i]);
return ans;
}
int main()
{
int t,n,m,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(i=;i<=m;i++)
scanf("%d",&b[i]);
printf("%d\n",LCIS(n,m));
if(t)
printf("\n");
}
}

hdu 1423 最长公共递增子序列的更多相关文章

  1. hdu 1423 最长公共递增子序列 LCIS

    最长公共上升子序列(LCIS)的O(n^2)算法 预备知识:动态规划的基本思想,LCS,LIS. 问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列). 首先我们可以看到,这个问题具有相 ...

  2. hdu 1423 最长上升递增子序列

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; ; in ...

  3. [ACM_动态规划] UVA 12511 Virus [最长公共递增子序列 LCIS 动态规划]

      Virus  We have a log file, which is a sequence of recorded events. Naturally, the timestamps are s ...

  4. HDU 4512 最长公共上升子序列

    各种序列复习: (1)最长上升子序列. 1.这个问题用动态规划就很好解决了,设dp[i]是以第i个数字结尾的上升子序列的最长长度.那么方程可以是dp[i]=max(dp[j]+1).(j<i). ...

  5. HDU 1423 最长公共字串+上升子序列

    http://acm.hdu.edu.cn/showproblem.php?pid=1423 在前一道题的基础上多了一次筛选 要选出一个最长的递增数列 lower_bound()函数很好用,二分搜索找 ...

  6. 最长递增子序列(lis)最长公共子序列(lcs) 最长公共上升子序列(lics)

    lis: 复杂度nlgn #include<iostream> #include<cstdio> using namespace std; ],lis[],res=; int ...

  7. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  8. [C++] 动态规划之矩阵连乘、最长公共子序列、最大子段和、最长单调递增子序列、0-1背包

    一.动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解. 将待求解问题分解成若干个子问题,先求解子 ...

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

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

随机推荐

  1. 【转】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程

    http://blog.csdn.net/xiaominghimi/article/details/6937097 //——2012-12-11日更新   获取"产品付费数量等于0这个问题& ...

  2. 轻松学习 red5 教程 像视频一样很详细还有代码直接可Copy

    转载自:http://blog.csdn.net/hongdianking/archive/2009/11/12/4804339.aspx 最近要做一个流媒体服务器,在网上逗留了好久决定选择 red5 ...

  3. Codeforces 602B Approximating a Constant Range(想法题)

    B. Approximating a Constant Range When Xellos was doing a practice course in university, he once had ...

  4. 视频: 千重浪Linux系统调试技术培训 03-01_Basic-CPU-Register

    免费轻松学习Linux系统调试技术 欢迎收看本工作室放到优酷上播放的免费教学视频. 清晰! 完整!  无病毒! 请点击:http://v.youku.com/v_show/id_XNjM1OTQ3Mj ...

  5. Web开源框架大汇总

    Struts 项目简介信息 Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的 ...

  6. .NET Reflector插件FileDisassembler还原源码

    NET Reflector,它是一个类浏览器和反编译器,可以分析程序集并向您展示它的所有秘密..NET 框架向全世界引入了可用来分析任何基于 .NET 的代码(无论它是单个类还是完整的程序集)的反射概 ...

  7. Nginx端口的修改

    修改 nginx.conf 文件实现.在 Linux 上该文件的路径为 /usr/local/nginx/conf/nginx.conf,Windows 下 安装目录\conf\nginx.conf. ...

  8. mysql数据库表间内外链接详解

    1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)(2)右外连接(右边的表不加限制)(3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语法: ...

  9. Exchange模式功能

    Exchange模式: Outlook中的投票功能: 新建邮件--选项--使用投票按钮

  10. cdoj 1250 喵哈哈的矩阵 数学题

    喵哈哈的矩阵 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1250 Desc ...