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的最长公共递增序列,不一定非得是连续的.刚开始看到的时候想的是先用求最长公共子序列,然后再从其中找到最长递增子序列,可是仔细想一想觉得这样有点不妥,然后从网 ...
随机推荐
- JSP学习初体验
JSP简介: 1)JSP--Java Server Pages 2)拥有servlet的特性与优点(本身就是一个servlet) 3)直接在HEML中内嵌JSP代码 4)JSP程序由JSP Engin ...
- iOS事件机制(一)
运用的前提是掌握 掌握的本质是理解 本篇内容将围绕iOS中事件及其传递机制进行学习和分析.在iOS中,事件分为三类: 触控事件(单点.多点触控以及各种手势操作) 传感器事件(重力.加速度传感器等) 远 ...
- Android问题-DelphiXE8安装后编译Android提示SDK无法更新问题(XE10也可以解决)
资料来原:http://www.chenruixuan.com/archives/479.html (DelphiXE8 更新SDK)http://www.dfwlt.com/forum.php?mo ...
- JSF 2 listbox example
In JSF, <h:selectOneListbox /> tag is used to render a single select listbox – HTML select ele ...
- [iOS基础控件 - 6.12.2] Modal
A.概念 1.也可以用来切换控制器 2.如ActionSheet 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展示出来 Modal的默认效果 ...
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)
题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. /* | 1, -1 | | fn | | 1, 0 | | f ...
- apacheserver下载、安装、配置
1.下载 下载地址:apache下载地址 点击左側"Download"下的链接,打开例如以下页面 这里能够选择版本号.我选择2.4.16.单击"2.4.16" ...
- stm32上的Lava虚拟机开发进度汇报(2)
现在已经基本完成了Lava主要函数的编写,但还是有几个问题没解决: 1.实心圆和实心椭圆 2.FillArea 3.GetWord 其中FillArea如果没有很好的解决方法就算了,GetWord用g ...
- RT-Thread学习笔记(2)
这段时间稍微折腾了一下stm32,稍微知道了一点stm32程序的编写方法,所以再次拿起了rtt,因为这个东西确实很强大. 随手记录一下rtt的一些知识: 1.关于finsh 这是一个命令行系统,很好玩 ...
- openssl生成rsa公私钥
1.生成私钥pem, 执行命令openssl genrsa -out rsa_private_key.pem 1024 2.生成公钥,执行命令openssl rsa -in rsa_private_ ...