hdu 1423 最长公共递增子序列
这题一开始把我给坑了,我还没知道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 最长公共递增子序列的更多相关文章
- hdu 1423 最长公共递增子序列 LCIS
最长公共上升子序列(LCIS)的O(n^2)算法 预备知识:动态规划的基本思想,LCS,LIS. 问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列). 首先我们可以看到,这个问题具有相 ...
- hdu 1423 最长上升递增子序列
#include <iostream> #include <cstdio> #include <cstring> using namespace std; ; in ...
- [ACM_动态规划] UVA 12511 Virus [最长公共递增子序列 LCIS 动态规划]
Virus We have a log file, which is a sequence of recorded events. Naturally, the timestamps are s ...
- HDU 4512 最长公共上升子序列
各种序列复习: (1)最长上升子序列. 1.这个问题用动态规划就很好解决了,设dp[i]是以第i个数字结尾的上升子序列的最长长度.那么方程可以是dp[i]=max(dp[j]+1).(j<i). ...
- HDU 1423 最长公共字串+上升子序列
http://acm.hdu.edu.cn/showproblem.php?pid=1423 在前一道题的基础上多了一次筛选 要选出一个最长的递增数列 lower_bound()函数很好用,二分搜索找 ...
- 最长递增子序列(lis)最长公共子序列(lcs) 最长公共上升子序列(lics)
lis: 复杂度nlgn #include<iostream> #include<cstdio> using namespace std; ],lis[],res=; int ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- [C++] 动态规划之矩阵连乘、最长公共子序列、最大子段和、最长单调递增子序列、0-1背包
一.动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解. 将待求解问题分解成若干个子问题,先求解子 ...
- 最长公共上升子序列(LCIS)
最长公共上升子序列慕名而知是两个字符串a,b的最长公共递增序列,不一定非得是连续的.刚开始看到的时候想的是先用求最长公共子序列,然后再从其中找到最长递增子序列,可是仔细想一想觉得这样有点不妥,然后从网 ...
随机推荐
- iomanip.h
http://baike.baidu.com/link?url=zuNLgcUVylhUYYefyV13F38NChIMx8nnCEWV5zkkTQMrrSdKPxUERZuydSHtp6sXukWv ...
- JAVA小笔记
一.system.err.println() 和 system.out.println() 有什么不同 同时使用了System.out.println与System.err.println()打印输入 ...
- 红帽 Enterprise Linux OpenStack Platform 4.0全面上市
十一月,红帽公司推出Red Hat Enterprise Linux OpenStack Platform 4.0测试版,这款企业级解决方案集Red Hat Enterprise Linux的稳定性与 ...
- C#中反射的使用(How to use reflect in CSharp)(3)Emit的使用
Emit意在动态构建一个可以执行(当然也就可以反射)或者只可以反射的动态库. 个人认为在不得不使用反射的情况下,使用Emit会使得效率提升空间很大.亦或者动态插件模式的软件设计中会用到. 依然2%的废 ...
- 理解Windows中的路由表和默认网关
每一个Windows系统中都具有IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息.路由表是TCP/IP通信的基础,本地计算机上的任何TCP/IP通信都受到路由表的控制. 理 ...
- MEF 编程指南(九):部件生命周期
理解 MEF 容器部件生命周期和实现是非常重要的事情.考虑到 MEF 关注可扩展应用程序.这变得尤为重要.生命期可以解释为期望部件的共享性(transitively, its exports) 共 ...
- Struts2常量的具体用法实例(一)
XML代码: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC ...
- stm32上的Lava虚拟机开发进度汇报(1)
这几天我打算在stm32上做一个lava的虚拟机,只要160*80的黑白显示就行了,主要是想怀旧一下,嘿嘿. 目前的进度是图形显示和按键处理完成了,还有文本显示.文件处理.其他函数等. 当然,这都仅是 ...
- Codeforces Round #179 (Div. 1) A. Greg and Array 离线区间修改
A. Greg and Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/295/pro ...
- HDU 5029 Relief grain 树链剖分打标记 线段树区间最大值
Relief grain Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...