博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2127 LICS模板
阅读量:6572 次
发布时间:2019-06-24

本文共 3541 字,大约阅读时间需要 11 分钟。

题目:

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

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

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

#include
#include
#include
#define ll long longusing namespace std;int n,m;bool use[505][505];ll a[505],b[505],d[505],pre[2][505][505];//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[0][cnt][k],pre[1][cnt][k]); if(use[cnt][k])printf("%lld ",b[k]);//主要用在cnt==n时判断输出此i否 }int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); scanf("%d",&m); for(int i=1;i<=m;i++)scanf("%lld",&b[i]); for(int i=1;i<=n;i++) { ll k=0; for(int j=1;j<=m;j++) //若没有选此i,行是之前的(就像d的自然copy一样) { if(use[i-1][j]) { pre[0][i][j]=i-1;pre[1][i][j]=j; } else { pre[0][i][j]=pre[0][i-1][j];pre[1][i][j]=pre[1][i-1][j]; } } for(int j=1;j<=m;j++) { if(a[i]>b[j]&&d[j]>d[k])k=j; else if(a[i]==b[j]&&d[j]
mx)mx=d[i],k=i; printf("%lld\n",mx); print(n,k); return 0;}

为什么这个比上一个慢?

#include
#include
#include
#define ll long longusing namespace std;int n,m;bool use[505][505];ll a[505],b[505],d[505],pre[2][505][505];//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[0][cnt][k],pre[1][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=1;i<=n;i++)scanf("%lld",&a[i]); scanf("%d",&m); for(int i=1;i<=m;i++)scanf("%lld",&b[i]); for(int i=1;i<=n;i++) { ll k=0; for(int j=1;j<=m;j++) //若没有选此i,行是之前的(就像d的自然copy一样) { if(use[i-1][j]) { pre[0][i][j]=i-1;pre[1][i][j]=j; } else { pre[0][i][j]=pre[0][i-1][j];pre[1][i][j]=pre[1][i-1][j]; } } for(int j=1;j<=m;j++) { if(a[i]>b[j]&&d[j]>d[k])k=j; else if(a[i]==b[j]&&d[j]
mx)mx=d[i],k=i; printf("%lld\n",mx); if(use[n][k])print(n,k); else print(pre[0][n][k],k); return 0;}

 另一种记录路径的方法

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

 

转载于:https://www.cnblogs.com/Narh/p/8538391.html

你可能感兴趣的文章
JavaScript 特殊效果代码
查看>>
【?】codeforces721E Road to Home(DP+单调队列)
查看>>
MySQL 仅保留7天、一个月数据
查看>>
OGG 11g Checkpoint 详解
查看>>
PHP中使用socket通信响应速度慢的原因与解决办法
查看>>
Win7下安装Mysql(解压缩版)
查看>>
UVA 11992 Fast Matrix Operations (降维)
查看>>
Asp.net core Identity + identity server + angular 学习笔记 (第一篇)
查看>>
暂时不想读研的几点理由
查看>>
增加临时表空间组Oracle11g单实例
查看>>
Diff Two Arrays
查看>>
stark组件(1):动态生成URL
查看>>
169. Majority Element
查看>>
大整数加法
查看>>
下拉菜单
查看>>
[清华集训2014]玛里苟斯
查看>>
Doctype作用?严格模式与混杂模式如何区分?它们有何意义
查看>>
0029-求最小的数
查看>>
【MVC+EasyUI实例】对数据网格的增删改查(上)
查看>>
第三章:如何建模服务
查看>>