P1439-DP【绿】
轻敌了啊...题目一共只有几句话但我却忽略了一个重大信息...
总之我显示写出了时空复杂度都是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【绿】的更多相关文章
- 「疫期集训day4」硝烟
那真是一阵恐怖的炮击(that boomed booms),响亮的炮音(that noise),滚滚的硝烟(that smoke),熊熊的火焰在围绕着我们前进...小心前进(go and be car ...
- P1439 【模板】最长公共子序列(DP)
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- 洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- 洛谷-P1439 【模板】最长公共子序列 (DP,离散化)
题意:给两个长度为\(n\)的全排列,求他们的LCS 题解:这题给的数据范围到\(10^5\),用\(O(n^2)\)的LCS模板过不了,但由于给的是两个全排列,他们所含的元素都是一样的,所以,我们以 ...
- DP擎天
DP! 黄题: 洛谷P2101 命运石之门的选择 假装是DP(分治 + ST表) CF 982C Cut 'em all! 树形贪心 洛谷P1020 导弹拦截 单调队列水题 绿题: 洛谷P1594 护 ...
- 【BZOJ-1260】涂色paint 区间DP
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1147 Solved: 698[Submit][Sta ...
- hdu4939 Stupid Tower Defense (DP)
2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131 ...
- 洛谷P2014 选课 (树形dp)
10月1日更新.题目:在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分 ...
- 【DP】BZOJ 1260: [CQOI2007]涂色paint
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 893 Solved: 540[Submit][Stat ...
- 周赛C题 LightOJ 1047 (DP)
C - C Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Description Th ...
随机推荐
- [GDOI22pj1A] 邹忌讽秦王纳谏
时间空间限制: 1 秒, 256 MB 齐国人邹忌对齐国国君齐威王说,大王身边的人会因为私情.利益等原因而对大王阿谀奉承,所以不能光听好话,只有广泛接受群众的批评意见,才不会被蒙蔽双眼,齐国才能强盛. ...
- 使用 VS 2019 将 c# 生成 DLL 动态链接库文件
主要步骤: ChatGPT 的回答: 你可以尝试使用 Visual Studio 创建一个类库项目,然后将你写的两个类添加到该项目中,并进行编译,最终生成 DLL 文件.具体步骤如下: 打开 Visu ...
- controller加载控制与业务bean加载控制
1.因功能的不同,如何避免Spring错误加载到SpringMVC的bean--加载Spring控制的bean的时候排除掉SpringMVC控制的bean. package com.itheima.c ...
- 11 HTTP的特点,优点和缺点
[toc] # HTTP的五大特点 # HTTP的优点 1. 最大的优点:简单.灵活和易于拓展 2. 拥有成熟的软硬件环境,应用的非常广泛,是互联网的基础设施 3. 是无状态的,可以轻松实现集群化, ...
- 一款开源免费美观的WinForm UI控件库 - ReaLTaiizor
前言 今天推荐一款基于MIT license开源.免费.美观的.NET WinForm UI控件库:ReaLTaiizor. 什么是WinForm? WinForm是一个传统的桌面应用程序框架,它基于 ...
- 从 ECMAScript 6 角度谈谈执行上下文
大家好,我是归思君 起因是最近了解JS执行上下文的时候,发现很多书籍和资料,包括<JavaScript高级程序设计>.<JavaScript权威指南>和网上的一些博客专栏,都是 ...
- 【C#】【串口通信(Serial Port)】无法使用(using System.IO.Ports;)命名空间<Error:SerialPort不存在上下文>
1.包缺失导致--安装相应包: 2.等待命令行初始化--输入命令: Install-Package Microsoft.Windows.Compatibility -Version 5.0.2 参考网 ...
- MinIO客户端之ls
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc ls 列出本地硬盘上的文件,命令如下: ./mc ls 控制台的输出,如下: [2023-12-14 23: ...
- Havoc C2d的初次使用
Havoc C2 简介 Havoc是一款现代化的.可扩展的后渗透命令控制框架 当前的Havoc版本还处于早期开发版,随着框架的不断成熟,可能会对Havoc的API和核心结构进行大量更改 以下的配置部分 ...
- RSA 加密算法
RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用.RSA是由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Ad ...