POJ2127 LICS模板
题目: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模板的更多相关文章
- 最长公共子序列模板(LCS)和LICS模板
递归式: 实例图解: 代码: #include<stdio.h> #include<string.h> ; int dp[N][N],f[N][N]; char a[N],b[ ...
- 最长公共上升子序列(LICS) 模板
void LICS() { ;i<=n;i++) { ; ;j<=n;j++) { if (a[i]==b[j]) f[i][j]=ma+; ][j]; ][j]>ma) ma=f[ ...
- HDU 1423 LICS 模板
http://acm.hdu.edu.cn/showproblem.php?pid=1423 4.LICS.O(lena * lenb) 设dp[i][j]表示a[]的前i项,以b[]的第j项结尾时, ...
- 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 ...
- Jade模板引擎让你飞
写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...
- ABP入门系列(2)——通过模板创建MAP版本项目
一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...
- CMS模板应用调研问卷
截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
随机推荐
- Socket编程基础篇
Socket又称"套接字",应用程序通常通过“套接字”向网络发生请求或者应答网络请求. Socket和ServerSocket类库位于java.net包中,ServerSocket ...
- iOS UI-表格控制器(UITableView)-基本使用
tableView的常见属性 cell的常见属性 一.一般情况 #import "ViewController.h" @interface ViewController ()< ...
- K8S镜像删除及环境清理
环境清理: #删除所有容器sudo docker rm -f $(sudo docker ps -qa) #删除/var/etcd目录sudo rm -rf /var/etcd #删除/var/lib ...
- 从零开始学习Vue(一)
因为最近有个项目的需求是,微信公众号+IOS/Android APP, 界面都很类似. 以往的做法是APP是调用JSON接口,后台只负责提供接口. 而H5,我以前都是用Jquery,用来写手机网站总是 ...
- 4.写出完整版的strcpy函数
(1) 2~4分 void strcpy(char *strDest, char *strSrc) { while((*strDest++ = *strSrc++)!='\0'); } //将源字符串 ...
- 51nod1709复杂度分析
题解: 注意到,如果第j位有贡献,那么从i往上跳2^j,然后不能再跳超过2^j. 因此可以考虑倍增. 代码: #include<bits/stdc++.h> typedef long lo ...
- EhLib 的 DbgridEh 影响 其他数据集的Open方法
DbgridEh 对应数据集ADOTable1,其中有个字段 部门编码,另外增加查找字段比如 部门名称 ADOTable2对应查找数据集,包含 部门编码和 部门名称字段. ADOTable1 打开后, ...
- L1-040 最佳情侣身高差
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高).如果符合,你俩的身高差不管是牵手.拥抱.接吻,都是最和谐的差度. 下面就请你写个程序,为任意一 ...
- 玩转X-CTR100 l STM32F4 l HMC5983/HMC5883L三轴磁力计传感器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 扩展HMC ...
- 0117 面向对象OOP有关方法、类、构造方法及权限修饰符的练习
public class juxing { //编写一个矩形类,将长与宽作为矩形类的属性,在构造方法中将长.宽初始化,定义一个成员方法求此矩形面积 int chang; int kuan; int m ...