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

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

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

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define ll long long
  5. using namespace std;
  6. int n,m;
  7. bool use[][];
  8. ll a[],b[],d[],pre[][][];//0是行,1是列;表示第i行与j匹配时
  9. void print(ll cnt,ll k) //用了这个i吗?(和j匹配时)(use[i][j])
  10. { //上一个是?(行是0,上一行与pre[1]匹配时,以定位)
  11. // printf("(cnt=%lld k=%lld)",cnt,k);
  12. if(!cnt)return;
  13. print(pre[][cnt][k],pre[][cnt][k]);
  14. if(use[cnt][k])printf("%lld ",b[k]);//主要用在cnt==n时判断输出此i否
  15. }
  16. int main()
  17. {
  18. scanf("%d",&n);
  19. for(int i=;i<=n;i++)scanf("%lld",&a[i]);
  20. scanf("%d",&m);
  21. for(int i=;i<=m;i++)scanf("%lld",&b[i]);
  22. for(int i=;i<=n;i++)
  23. {
  24. ll k=;
  25. for(int j=;j<=m;j++) //若没有选此i,行是之前的(就像d的自然copy一样)
  26. {
  27. if(use[i-][j])
  28. {
  29. pre[][i][j]=i-;pre[][i][j]=j;
  30. }
  31. else
  32. {
  33. pre[][i][j]=pre[][i-][j];pre[][i][j]=pre[][i-][j];
  34. }
  35. }
  36. for(int j=;j<=m;j++)
  37. {
  38. if(a[i]>b[j]&&d[j]>d[k])k=j;
  39. else if(a[i]==b[j]&&d[j]<d[k]+)//选此i
  40. {
  41. d[j]=d[k]+;
  42. if(use[i-][k])
  43. {
  44. pre[][i][j]=i-;pre[][i][j]=k;
  45. }
  46. else
  47. {
  48. pre[][i][j]=pre[][i-][k];pre[][i][j]=k;//用的不是上一行的j,而是k
  49. }
  50. use[i][j]=;
  51. }
  52. }
  53. }
  54. ll mx=,k=;
  55. for(int i=;i<=m;i++)
  56. if(d[i]>mx)mx=d[i],k=i;
  57. printf("%lld\n",mx);
  58. print(n,k);
  59. return ;
  60. }

为什么这个比上一个慢?

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define ll long long
  5. using namespace std;
  6. int n,m;
  7. bool use[][];
  8. ll a[],b[],d[],pre[][][];//0是行,1是列;表示第i行与j匹配时
  9. void print(ll cnt,ll k) //用了这个i吗?(和j匹配时)(use[i][j])
  10. { //上一个是?(行是0,上一行与pre[1]匹配时,以定位)
  11. // printf("(cnt=%lld k=%lld)",cnt,k);
  12. if(!cnt)return;
  13. print(pre[][cnt][k],pre[][cnt][k]);
  14. // if(use[cnt][k])printf("%lld ",b[k]);//主要用在cnt==n时判断输出此i否
  15. printf("%lld ",b[k]);
  16. }
  17. int main()
  18. {
  19. scanf("%d",&n);
  20. for(int i=;i<=n;i++)scanf("%lld",&a[i]);
  21. scanf("%d",&m);
  22. for(int i=;i<=m;i++)scanf("%lld",&b[i]);
  23. for(int i=;i<=n;i++)
  24. {
  25. ll k=;
  26. for(int j=;j<=m;j++) //若没有选此i,行是之前的(就像d的自然copy一样)
  27. {
  28. if(use[i-][j])
  29. {
  30. pre[][i][j]=i-;pre[][i][j]=j;
  31. }
  32. else
  33. {
  34. pre[][i][j]=pre[][i-][j];pre[][i][j]=pre[][i-][j];
  35. }
  36. }
  37. for(int j=;j<=m;j++)
  38. {
  39. if(a[i]>b[j]&&d[j]>d[k])k=j;
  40. else if(a[i]==b[j]&&d[j]<d[k]+)//选此i
  41. {
  42. d[j]=d[k]+;
  43. if(use[i-][k])
  44. {
  45. pre[][i][j]=i-;pre[][i][j]=k;
  46. }
  47. else
  48. {
  49. pre[][i][j]=pre[][i-][k];pre[][i][j]=k;//用的不是上一行的j,而是k
  50. }
  51. use[i][j]=;
  52. }
  53. }
  54. }
  55. ll mx=,k=;
  56. for(int i=;i<=m;i++)
  57. if(d[i]>mx)mx=d[i],k=i;
  58. printf("%lld\n",mx);
  59. if(use[n][k])print(n,k);
  60. else print(pre[][n][k],k);
  61. return ;
  62. }

另一种记录路径的方法

  1. #include<iostream>
  2. #include<cstdio>
  3. #define ll long long
  4. using namespace std;
  5. const ll INF=;//////防RE,不能大于底下的数组
  6. ll n,m;
  7. ll a[],b[],d[],pre[][];
  8. bool prin[];
  9. void print(ll i,ll j)
  10. {
  11. if(!i)return;
  12. print(i-,pre[i][j]);
  13. if(pre[i-][j]!=pre[i][j]&&!prin[j])printf("%lld ",b[j]),prin[j]=;//以防真实匹配的i的后一个非真实时的输出
  14. // printf("i=%d j=%d\n",i,j); //用d的值判断比较方便,但不想开二维
  15. }
  16. int main()
  17. {
  18. scanf("%lld",&n);
  19. for(ll i=;i<=n;i++)scanf("%lld",&a[i]);
  20. scanf("%lld",&m);
  21. for(ll i=;i<=m;i++)scanf("%lld",&b[i]);
  22. for(ll i=;i<=n;i++)
  23. {
  24. ll k=;
  25. for(ll j=;j<=m;j++)
  26. {
  27. pre[i][j]=j;
  28. if(a[i]>b[j]&&d[j]>d[k])k=j;
  29. else if(a[i]==b[j]&&d[j]<d[k]+)
  30. {
  31. d[j]=d[k]+;
  32. pre[i][j]=k;//当i是第一个,且i与某个匹配时,i的pre与i-1(0)的pre相同了
  33. if(!k)pre[i][j]=INF;
  34. }
  35. }
  36. }
  37. ll k=,mx=;
  38. for(ll i=;i<=m;i++)
  39. if(d[i]>mx)mx=d[i],k=i;
  40. printf("%lld\n",mx);
  41. print(n,k);
  42. }

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. Socket编程基础篇

    Socket又称"套接字",应用程序通常通过“套接字”向网络发生请求或者应答网络请求. Socket和ServerSocket类库位于java.net包中,ServerSocket ...

  2. iOS UI-表格控制器(UITableView)-基本使用

    tableView的常见属性 cell的常见属性 一.一般情况 #import "ViewController.h" @interface ViewController ()< ...

  3. K8S镜像删除及环境清理

    环境清理: #删除所有容器sudo docker rm -f $(sudo docker ps -qa) #删除/var/etcd目录sudo rm -rf /var/etcd #删除/var/lib ...

  4. 从零开始学习Vue(一)

    因为最近有个项目的需求是,微信公众号+IOS/Android APP, 界面都很类似. 以往的做法是APP是调用JSON接口,后台只负责提供接口. 而H5,我以前都是用Jquery,用来写手机网站总是 ...

  5. 4.写出完整版的strcpy函数

    (1) 2~4分 void strcpy(char *strDest, char *strSrc) { while((*strDest++ = *strSrc++)!='\0'); } //将源字符串 ...

  6. 51nod1709复杂度分析

    题解: 注意到,如果第j位有贡献,那么从i往上跳2^j,然后不能再跳超过2^j. 因此可以考虑倍增. 代码: #include<bits/stdc++.h> typedef long lo ...

  7. EhLib 的 DbgridEh 影响 其他数据集的Open方法

    DbgridEh 对应数据集ADOTable1,其中有个字段 部门编码,另外增加查找字段比如 部门名称 ADOTable2对应查找数据集,包含 部门编码和 部门名称字段. ADOTable1 打开后, ...

  8. L1-040 最佳情侣身高差

    专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高).如果符合,你俩的身高差不管是牵手.拥抱.接吻,都是最和谐的差度. 下面就请你写个程序,为任意一 ...

  9. 玩转X-CTR100 l STM32F4 l HMC5983/HMC5883L三轴磁力计传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 扩展HMC ...

  10. 0117 面向对象OOP有关方法、类、构造方法及权限修饰符的练习

    public class juxing { //编写一个矩形类,将长与宽作为矩形类的属性,在构造方法中将长.宽初始化,定义一个成员方法求此矩形面积 int chang; int kuan; int m ...