这题一开始把我给坑了,我还没知道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. UVALive 7274 Canvas Painting (优先队列)

    Canvas Painting 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/C Description http://7xjo ...

  2. POJ 2387 Til the Cows Come Home (最短路 dijkstra)

    Til the Cows Come Home 题目链接: http://acm.hust.edu.cn/vjudge/contest/66569#problem/A Description Bessi ...

  3. HDU 1312 http://acm.hdu.edu.cn/showproblem.php?pid=1312

    #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #de ...

  4. Educational Codeforces Round 7 - E. Ants in Leaves

    题目链接:http://www.codeforces.com/contest/622/problem/E 题意是给你一棵树,1为根,每个叶子节点有一个蚂蚁,移动到一个邻接节点时间耗费为1,一个节点上不 ...

  5. Windows Server2008 R2 MVC 环境配置

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. word2007 每页显示表头

    word2007 每页显示表头 在Word 2007文档中,如果一张表格需要在多页中跨页显示,则设置标题行重复显示很有必要,因为这样会在每一页都明确显示表格中的每一列所代表的内容.在Word 2007 ...

  7. Oracle新建用户、角色,授权,建表空间

    oracle数据库的权限系统分为系统权限与对象权限.系统权限( database system privilege )可以让用户执行特定的命令集.例如,create table权限允许用户创建表,gr ...

  8. oracle中extents存在的理由

    extents的特性:1:一个extent由相连的多个blocks组成,多个extents组成一个segment,2:oracle在为segment分配空间时,是以extent为单位因此extents ...

  9. Cocos2d-x——CocosBuilder官方帮助文档翻译3 动画

    Working with Animations 动画 You can use CocosBuilder for creating character animations, animating com ...

  10. VMM服务模板(虚机、APP)部署排错

    I won't focus this blog on how to create a service template but more on how you can track the change ...