轻敌了啊...题目一共只有几句话但我却忽略了一个重大信息...

总之我显示写出了时空复杂度都是n^2级别的朴素递推算法,这没什么,基本功而已,然后50分

我试了试滚动数组,把空间复杂度降到了n级别,但没什么用,解决了MLE但仍然TLE。

后来我想到记搜应该能算的更快,毕竟有些用不到的点用搜索就不用算了,但是空间不允许开n^2,所以我先是试着只抛弃那些没用到的点,即搞了一个pos->int的map,pos是一个自定义数据结构含有两个int表示数组下标。期间遇到编译错误, 然后就学到了一个知识点那就是unordered_map不需要比较运算符但是map需要比较运算符,也就是说如果自定义数据结构那你就必须给出operater<,更重要的是还必须声明这是一个const成员函数,即写成bool operator<(const pos & b)const的形式,后面这个const表示这个成员函数绝对不改数据,不加它就报错....总之解决问题后成功用上了这个做法,然后好像是60分了

再然后我想不如利用更多的空余空间,谁说记搜和滚动数组不能一起用,于是我成功了,分别基于动态数组和map各设计了一套空间复杂度极低的记忆化搜索算法,但我TMD写完之后才意识到不是记搜用不了滚动数组,而是记搜用滚动数组将不得不负责清理数组而不能无脑覆盖,因为记搜的调表顺序不同,可问题在于清理数组是一个O(n)级别的操作这就导致滚动数组式的dp几乎铁定耗时比递推滚动数组要满,空间复杂度还只能勉强一样,那显然还不如最开始的写法呢...果然,只有十分二十分....越写越回旋

写的我都饿了,就去看了看题解,才发现我忽略了一个条件那就是两个数列都是1~n的全排列!这道最长公共子序列可以转换成最长上升子序列...

啊啊啊啊啊啊所以最后我没做出来这道题在于我一开始就想偏了,普通的最长公共子序列压根就不存在!不存在!O(n^2)的算法!!!我一直在寻找一个不存在的东西当然一无所获...

当然也不算是一无所获,毕竟我获得了map、unordered_map相关的更深层的理解和更高的运用熟练度,还意识到了记搜能搞滚动数组但是不应该搞滚动数组...以及尝试用记搜代替递推的方式似乎几乎不可能解决耗时问题...

总之这道最长公共子序列不是一道普通的最长公共子序列题,是一道变了形的最长上升子序列题,那么答案很显然了。

朴素滚动数组DP

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
int n,a[100000+5],b[100000+5],dp[100000+5],new_dp[100000+5]; int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i]==b[j]) new_dp[j]=1+dp[j-1];
else new_dp[j]=max(dp[j],new_dp[j-1]);
}
for(int j=n;j>=1;j--)dp[j]=new_dp[j];
}
printf("%d",dp[n]);
return 0;
}

记搜+map-Code

#include <iostream>
#include <map> using namespace std;
int n,a[100000+5],b[100000+5];
struct pos
{
int x;int y;
pos(){}
pos(int X,int Y){x=X;y=Y;}
bool operator<(const pos & b)const
{
if((this->x)!=(b.x))return (this->x)<(b.x);
else return (this->y)<(b.y);
}
};
map<pos,int> dp;
int dfs(int i,int j)
{
if(i==0||j==0)return 0;
pos && POS=pos(i,j);
if(dp.count(POS)==1)return dp[POS];
if(a[i]==b[j]) return dp[POS]=1+dfs(i-1,j-1);
else return dp[POS]=max(dfs(i-1,j),dfs(i,j-1));
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
printf("%d",dfs(n,n)); return 0;
}

记搜+滚动数组Code1

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <unordered_map>
#include <queue>
#include <cmath>
using namespace std;
int n,a[100000+5],b[100000+5];
unordered_map<int,int>dp;
int dfs(int i,int j)
{
if(i==0||j==0)return 0;
if(dp.count(j)!=0)return dp[j];
if(a[i]==b[j])
{
dp.clear();
return 1+dfs(i-1,j-1);
}
else
{
int ans1=dfs(i,j-1);
dp.clear();
int ans2=dfs(i-1,j);
return max(ans1,ans2);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
printf("%d",dfs(n,n));
return 0;
}

记搜+滚动数组Code2

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
int n,a[100000+5],b[100000+5];
int * dp; int dfs(int i,int j)
{
if(i==0||j==0)return 0;
if(dp[j]!=-1)return dp[j];
if(a[i]==b[j])
{
delete[] dp;
dp=new int [j];
for(int k=0;k<j;k++)dp[k]=-1;
return 1+dfs(i-1,j-1);
}
else
{
int ans1=dfs(i,j-1);
delete []dp;
dp=new int [j+1];
for(int k=0;k<=j;k++)dp[k]=-1;
int ans2=dfs(i-1,j);
return max(ans1,ans2);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
dp=new int [n+1];
for(int k=0;k<=n;k++)dp[k]=-1;
printf("%d",dfs(n,n));
return 0;
}

P1439-DP【绿】的更多相关文章

  1. 「疫期集训day4」硝烟

    那真是一阵恐怖的炮击(that boomed booms),响亮的炮音(that noise),滚滚的硝烟(that smoke),熊熊的火焰在围绕着我们前进...小心前进(go and be car ...

  2. P1439 【模板】最长公共子序列(DP)

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  3. 洛谷 P1439 【模板】最长公共子序列(DP,LIS?)

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  4. 洛谷-P1439 【模板】最长公共子序列 (DP,离散化)

    题意:给两个长度为\(n\)的全排列,求他们的LCS 题解:这题给的数据范围到\(10^5\),用\(O(n^2)\)的LCS模板过不了,但由于给的是两个全排列,他们所含的元素都是一样的,所以,我们以 ...

  5. DP擎天

    DP! 黄题: 洛谷P2101 命运石之门的选择 假装是DP(分治 + ST表) CF 982C Cut 'em all! 树形贪心 洛谷P1020 导弹拦截 单调队列水题 绿题: 洛谷P1594 护 ...

  6. 【BZOJ-1260】涂色paint 区间DP

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1147  Solved: 698[Submit][Sta ...

  7. hdu4939 Stupid Tower Defense (DP)

    2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131 ...

  8. 洛谷P2014 选课 (树形dp)

    10月1日更新.题目:在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分 ...

  9. 【DP】BZOJ 1260: [CQOI2007]涂色paint

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 893  Solved: 540[Submit][Stat ...

  10. 周赛C题 LightOJ 1047 (DP)

    C - C Time Limit:500MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu   Description Th ...

随机推荐

  1. RabbitMQ入门到进阶

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...

  2. pytorch学习笔记——加载checkpoint时,程序报错,存在GPU和CPU不同步的情况

    当我们需要加载之前训练的checkpoint的时候,有时候会发现之前能训练的代码无法继续训练. 这时候很有可能加载优化器的步骤在加载模型前面,这样可能会导致优化器的参数仍然在CPU上,因此代码需要由原 ...

  3. Codeforces Round #426 (Div. 2) A. The Useless Toy

    A. The Useless Toy time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  4. 2024年 Kubernetes 四大趋势预测

    Kubernetes 在生产环境中的复杂性已经成为常态,在2023年这个平台工程盛行的时代,容器管理的最大亮点可能在于其灵活性,然而在运维政策和治理等方面仍然存在诸多挑战.Kubernetes 最大的 ...

  5. ElasticSearch之Refresh API

    使用本方法,显式的执行refresh操作. 默认情况下,ElasticSearch启动后台任务,周期性执行refresh操作,周期使用参数index.refresh_interval控制. 本方法触发 ...

  6. pacman下载时经常出现Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds

    问题 我在manjaro系统上使用pacman下载软件的时候,经常出现以下报错: 错误:无法从 mirrors.tuna.tsinghua.edu.cn : Operation too slow. L ...

  7. Programming abstractions in C阅读笔记:p184-p195

    <Programming Abstractions In C>学习第61天,p184-p195总结. 一.技术总结 1.mutual recursion 2.natural number ...

  8. SHA加密解密

    一.概述 SHA(Secure Hash Algorithm,安全哈希算法)是一类广泛应用于加密领域的算法,主要用于数据完整性校验和加密认证.SHA算法首次出现在1993年,由美国国家安全局(NSA) ...

  9. 【“互联网+”大赛华为云赛道】EI命题攻略:华为云EI的能力超丰富,助你实现AI梦想

    摘要:本次"互联网+"大赛华为云赛道EI命题,从实际业务场景出发,在人工智能和大数据领域推出四个命题. 本文分享自华为云社区<["互联网+"大赛华为云赛道 ...

  10. 华为云开天aPaaS 上线,服务千万开发者,使能行业场景化创新

    摘要:9月25日,华为云在华为全联接2021发布四大生态策略,并宣布2022年投入1亿美元升级沃土云创计划.华为云开天aPaaS正式上线,实现经验即服务,使能行业场景化创新. 本文分享自华为云社区&l ...