题目:http://poj.org/problem?id=2127

十分费劲地终于记录好了路径……用一个前驱。

这是 n^2 的LICS方法。其实就是 n ^ 2 log n 把“找之前的d [ j ]的max”用树状数组弄成了 n ^ 2,而这个则在每个 i 遍历 j 的时候顺便更新记录好了要用的那个值,就线性了。

j 是脚标。k 的更新有时间差,保证了“只能用脚标比自己小的”这个条件。

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int n,m;
bool use[][];
ll a[],b[],d[],pre[][][];//0是行,1是列;表示第i行与j匹配时
void print(ll cnt,ll k) //用了这个i吗?(和j匹配时)(use[i][j])
{ //上一个是?(行是0,上一行与pre[1]匹配时,以定位)
// printf("(cnt=%lld k=%lld)",cnt,k);
if(!cnt)return;
print(pre[][cnt][k],pre[][cnt][k]);
if(use[cnt][k])printf("%lld ",b[k]);//主要用在cnt==n时判断输出此i否
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++)scanf("%lld",&b[i]);
for(int i=;i<=n;i++)
{
ll k=;
for(int j=;j<=m;j++) //若没有选此i,行是之前的(就像d的自然copy一样)
{
if(use[i-][j])
{
pre[][i][j]=i-;pre[][i][j]=j;
}
else
{
pre[][i][j]=pre[][i-][j];pre[][i][j]=pre[][i-][j];
}
}
for(int j=;j<=m;j++)
{
if(a[i]>b[j]&&d[j]>d[k])k=j;
else if(a[i]==b[j]&&d[j]<d[k]+)//选此i
{
d[j]=d[k]+;
if(use[i-][k])
{
pre[][i][j]=i-;pre[][i][j]=k;
}
else
{
pre[][i][j]=pre[][i-][k];pre[][i][j]=k;//用的不是上一行的j,而是k
}
use[i][j]=;
}
}
}
ll mx=,k=;
for(int i=;i<=m;i++)
if(d[i]>mx)mx=d[i],k=i;
printf("%lld\n",mx);
print(n,k);
return ;
}

为什么这个比上一个慢?

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int n,m;
bool use[][];
ll a[],b[],d[],pre[][][];//0是行,1是列;表示第i行与j匹配时
void print(ll cnt,ll k) //用了这个i吗?(和j匹配时)(use[i][j])
{ //上一个是?(行是0,上一行与pre[1]匹配时,以定位)
// printf("(cnt=%lld k=%lld)",cnt,k);
if(!cnt)return;
print(pre[][cnt][k],pre[][cnt][k]);
// if(use[cnt][k])printf("%lld ",b[k]);//主要用在cnt==n时判断输出此i否
printf("%lld ",b[k]);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++)scanf("%lld",&b[i]);
for(int i=;i<=n;i++)
{
ll k=;
for(int j=;j<=m;j++) //若没有选此i,行是之前的(就像d的自然copy一样)
{
if(use[i-][j])
{
pre[][i][j]=i-;pre[][i][j]=j;
}
else
{
pre[][i][j]=pre[][i-][j];pre[][i][j]=pre[][i-][j];
}
}
for(int j=;j<=m;j++)
{
if(a[i]>b[j]&&d[j]>d[k])k=j;
else if(a[i]==b[j]&&d[j]<d[k]+)//选此i
{
d[j]=d[k]+;
if(use[i-][k])
{
pre[][i][j]=i-;pre[][i][j]=k;
}
else
{
pre[][i][j]=pre[][i-][k];pre[][i][j]=k;//用的不是上一行的j,而是k
}
use[i][j]=;
}
}
}
ll mx=,k=;
for(int i=;i<=m;i++)
if(d[i]>mx)mx=d[i],k=i;
printf("%lld\n",mx);
if(use[n][k])print(n,k);
else print(pre[][n][k],k);
return ;
}

另一种记录路径的方法

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const ll INF=;//////防RE,不能大于底下的数组
ll n,m;
ll a[],b[],d[],pre[][];
bool prin[];
void print(ll i,ll j)
{
if(!i)return;
print(i-,pre[i][j]);
if(pre[i-][j]!=pre[i][j]&&!prin[j])printf("%lld ",b[j]),prin[j]=;//以防真实匹配的i的后一个非真实时的输出
// printf("i=%d j=%d\n",i,j); //用d的值判断比较方便,但不想开二维
}
int main()
{
scanf("%lld",&n);
for(ll i=;i<=n;i++)scanf("%lld",&a[i]);
scanf("%lld",&m);
for(ll i=;i<=m;i++)scanf("%lld",&b[i]);
for(ll i=;i<=n;i++)
{
ll k=;
for(ll j=;j<=m;j++)
{
pre[i][j]=j;
if(a[i]>b[j]&&d[j]>d[k])k=j;
else if(a[i]==b[j]&&d[j]<d[k]+)
{
d[j]=d[k]+;
pre[i][j]=k;//当i是第一个,且i与某个匹配时,i的pre与i-1(0)的pre相同了
if(!k)pre[i][j]=INF;
}
}
}
ll k=,mx=;
for(ll i=;i<=m;i++)
if(d[i]>mx)mx=d[i],k=i;
printf("%lld\n",mx);
print(n,k);
}

POJ2127 LICS模板的更多相关文章

  1. 最长公共子序列模板(LCS)和LICS模板

    递归式: 实例图解: 代码: #include<stdio.h> #include<string.h> ; int dp[N][N],f[N][N]; char a[N],b[ ...

  2. 最长公共上升子序列(LICS) 模板

    void LICS() { ;i<=n;i++) { ; ;j<=n;j++) { if (a[i]==b[j]) f[i][j]=ma+; ][j]; ][j]>ma) ma=f[ ...

  3. HDU 1423 LICS 模板

    http://acm.hdu.edu.cn/showproblem.php?pid=1423 4.LICS.O(lena * lenb) 设dp[i][j]表示a[]的前i项,以b[]的第j项结尾时, ...

  4. HDU1423:Greatest Common Increasing Subsequence(LICS)

    Problem Description This is a problem from ZOJ 2432.To make it easyer,you just need output the lengt ...

  5. Jade模板引擎让你飞

    写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...

  6. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  7. CMS模板应用调研问卷

    截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...

  8. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  9. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

随机推荐

  1. PHP:第一章——PHP中常量和预定义常量

    <?php /*****************************************************/ //1.常量的定义 //常量:声明一次后长期不变的量,以字母或下划线开 ...

  2. Python 数据类型--Bytes类型

    一.Bytes类型 在Python3以后,字符串和bytes类型彻底分开了.字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的. bytes数据类型在所有的操作和使用甚至内置方法上和字 ...

  3. 离线部署 Cloudera Manager 5 和 CDH 5.12.1 及使用 CDH 部署 Hadoop 集群服务

    Cloudera Manager Cloudera Manager 分为两个部分:CDH和CM. CDH是Cloudera Distribution Hadoop的简称,顾名思义,就是cloudera ...

  4. DevExpress v17.2—WPF篇(一)

    用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WPF v17.2 新的Hamburger Menu.Sched ...

  5. SaltStack一键部署负载均衡和高可用

    一.负载均衡的部署 server1    haproxy (调度器) server2    apache server3    nginx 1)在server1上首先安装salt-minion服务.并 ...

  6. oracle function用法(本文来自百度文库)

    函数调用限制 1.SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数 2.SQL只能调用带有输入参数,不能带有输出,输入输出函数 3.SQL不能使用PL/SQL的特有数据类型(boole ...

  7. 解决Android4.3版本下,手机短彩接收中文文件名附件,中文名字的附件无法保存(第二步:解决从从数据库中读取附件文件名,并在长按后保存附件时,中文乱码导致的无法保存附件)

    从第一步我们发现,在第一步修改之后,在短彩绘画界面中中文附件名的附件已无法显示,经过打印堆栈我们发现还是中文乱码在作祟.下面我们接着进行分析,这次我们从UI层往逻辑处理层进行分析.首先我们找到保存附件 ...

  8. golang多核的使用

    实际上协程只是发生在单个进程内部的,要是想充分的发掘多核CPU的潜力,还是需要多进程的支持. 对于多核编程,go是天生支持,那么我们在什么情况下应该用多核心来加速程序,而在什么情况下用单核即可呢? 现 ...

  9. Linux下常用的ftp操作命令

    Linux下常用的ftp操作命令 =========== 完美的分割线 ============= 1.登陆ftp服务器 ftp [IP] [PORT] # 登陆ftp服务器,本机登陆可以不写IP 实 ...

  10. 如何用移动硬盘安装win7 系统

    身边没有U盘和光盘,就只有一个移动硬盘.移动硬盘安装系统是怎么进行的.在这里小毛孩来给大家上一课. 前期准备: 1.移动硬盘. 2.win7 32位的操作系统(*.iso). 3.有系统且可开机的电脑 ...