动态规划_基础_最长公共子序列_多种方法_递归/dp
D: 魔法少女资格面试
题目描述
众所周知,魔法少女是一个低危高薪职业。随着近年来报考魔法少女的孩子们越来越多,魔法少女行业已经出现饱和现象!
为了缓和魔法少女界的就业压力,魔法少女考核员丁丁妹决定增加魔法少女资质考核的难度。
然而,即使如此,通过资质考核的魔法少女们数量仍然过多,因此,丁丁妹决心增加一轮面试,从而淘汰掉更多的预备魔法少女。
具体而言,她打算对所有面试者询问这样一个问题:
给两个长度为
n
的全排列,它们的最长公共子序列长度是多少?
不幸的是,由于丁丁妹没有好好上过学,她自己也不知道答案是多少,因此她使用魔法找到了你,希望你来帮她解决这个问题。
输入描述
每个测试点仅有一组数据。
第一行是一个正整数
n
,表示全排列长度。
第二行有
n
个整数,保证是一个
n
的全排列。
第三行有
n
个整数,保证是一个
n
的全排列。
其中,保证
1
≤
n
≤
1000
。
输出描述
输出一行一个整数,表示两数组的最长公共子序列长度。
样例输入
5
1 3 2 4 5
5 2 3 1 4
样例输出
2
Hint
如果你愿意思考
1
≤
n
≤
1000000
时的解法,那么丁丁妹会很高兴地录取你。
题解思路
这道题思路比较明显的,关系式就是:
也可以从后往前写成
L(i,j)=L(i+1,j+1)取等
L(i,j)=max(L(i,j+1),L(i+1,j))不等
但是这个式子我用递归直接写,就给TE了,如下为代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <numeric>
using namespace std;
typedef long long ll;
const int M=1e3+;
int n;
int a[M],b[M];
int ans=; int dfs(int x,int y) {
int t=;
if(y>n||x>n) {
return t;
} else if(a[x]==b[y]) {
t=+dfs(x+,y+);
} else {
int t1=dfs(x,y+);
int t2=dfs(x+,y);
t=max(t1,t2);
} ans=max(ans,t);
return t; }
/*
6
5 3 1 4 2 6
1 5 3 2 4 6
*/
int main() {
scanf("%d",&n);
for(int i=; i<=n; i++)scanf("%d",&a[i]);
for(int i=; i<=n; i++)scanf("%d",&b[i]);
dfs(,);
printf("%d\n",ans);
return ; }
改了一下,写成动态规划,将原本dfs(i,j)改写成dp【i】【j】存起来
i ,j,表示当前序列 — a,b,分别在哪个位置,dp【i】【j】表示在这一状态下,a1-- ai 与 b1-- bj,存在最大公共子序列的长度
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <numeric>
using namespace std;
typedef long long ll;
const int M=1e3+;
int n;
int a[M],b[M];
int ans=;
int dp[M][M];
/*
int dfs1(int x,int y) {
int t=0;
if(y>n||x>n) {
return t;
} else if(a[x]==b[y]) {
t=1+dfs(x+1,y+1);
} else {
int t1=dfs(x,y+1);
int t2=dfs(x+1,y);
t=max(t1,t2);
} ans=max(ans,t);
return t; } int dfs(int x,int y) {
int t=0;
if(y<1||x<1) {
return t;
} else if(a[x]==b[y]) {
t=1+dfs(x-1,y-1);
} else {
int t1=dfs(x,y-1);
int t2=dfs(x-1,y);
t=max(t1,t2);
} ans=max(ans,t);
return t; }*/
/*
6
5 3 1 4 2 6
1 5 3 2 4 6
*/
void f() {
int i,j;
memset(dp,,sizeof(dp)); for( i=; i<=n; i++) {
for( j=; j<=n; j++) {
if(a[i]==b[j]) {
dp[i][j]=dp[i-][j-]+;
} else {
dp[i][j]=max(dp[i-][j],dp[i][j-]);
}
}
}
printf("%d\n",dp[n][n]); } int main() {
scanf("%d",&n);
for(int i=; i<=n; i++)scanf("%d",&a[i]);
for(int i=; i<=n; i++)scanf("%d",&b[i]);
f();
// int n1=n;
//dfs(n1,n1);
//printf("%d\n",ans);
return ; }
(AC代码)
动态规划_基础_最长公共子序列_多种方法_递归/dp的更多相关文章
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 动态规划模板2|LCS最长公共子序列
LCS最长公共子序列 模板代码: #include <iostream> #include <string.h> #include <string> using n ...
- 对最长公共子序列(LCS)等一系列DP问题的研究
LIS问题: 设\(f[i]\)为以\(a[i]\)结尾的最长上升子序列长度,有: \[f[i]=f[j]+1(j<i&&a[j]<a[i])\] 可以用树状数组优化至\( ...
- 动态规划----最长公共子序列(LCS)问题
题目: 求解两个字符串的最长公共子序列.如 AB34C 和 A1BC2 则最长公共子序列为 ABC. 思路分析:可以用dfs深搜,这里使用到了前面没有见到过的双重循环递归.也可以使用动态规划,在建 ...
- 动态规划 - 最长公共子序列(LCS)
最长公共子序列也是动态规划中的一个经典问题. 有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为 S1 和 S2 的子串,且要求它的长度最长,并确定这个长度.这个问题被我们称 ...
- 动态规划——最长公共子序列LCS及模板
摘自 https://www.cnblogs.com/hapjin/p/5572483.html 这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字 ...
- [Python]最长公共子序列 VS 最长公共子串[动态规划]
前言 由于原微软开源的基于古老的perl语言的Rouge依赖环境实在难以搭建,遂跟着Rouge论文的描述自行实现. Rouge存在N.L.S.W.SU等几大子评估指标.在复现Rouge-L的函数时,便 ...
- 最长公共子序列lcs 51nod1006
推荐参考博客:动态规划基础篇之最长公共子序列问题 - CSDN博客 https://blog.csdn.net/lz161530245/article/details/76943991 个人觉得上面 ...
- HDU 1159 Common Subsequence --- DP入门之最长公共子序列
题目链接 基础的最长公共子序列 #include <bits/stdc++.h> using namespace std; ; char c[maxn],d[maxn]; int dp[m ...
- 最长公共子序列python实现
最长公共子序列是动态规划基本题目,以下依照动态规划基本步骤解出来. 1.找出最优解的性质,并刻划其结构特征 序列a共同拥有m个元素,序列b共同拥有n个元素,假设a[m-1]==b[n-1],那么a[: ...
随机推荐
- EFCore DbContext 报SqlException: Incorrect syntax near 'OFFSET'.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSq ...
- 【分布式锁】07-Zookeeper实现分布式锁:Semaphore、读写锁实现原理
前言 前面已经讲解了Zookeeper可重入锁的实现原理,自己对分布式锁也有了更深的认知. 我在公众号中发了一个疑问,相比于Redis来说,Zookeeper的实现方式要更好一些,即便Redis作者实 ...
- Java集合工具类使用的一些坑,Arrays.asList()、Collection.toArray()、foreach
Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...
- 2.Django与Vue的结合
Django与Vue的结合 在django项目中创建vue项目 首先,进去django项目的项目目录中,执行: vue-init webpack firstvue ## firstvue为前端项目的名 ...
- mongodb_2
一.游标 在mongodb中,底层使用js引擎进行各种操作,所以我们在命令行窗口,可直接执行js代码. #使用for循环,插入1000条数据. > for (var i=0;i<1000; ...
- 【深度学习】Neural networks(神经网络)(一)
神经网络的图解 感知机,是人工设置权重.让它的输出值符合预期. 而神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数. 如果用图来表示神经网络,最左边的一列称为输入层,最右边的一列称为输 ...
- coding++ :在引入的css或者js文件后面加参数的作用
前沿: 有些小伙伴们在页面(F12)直接对 JS.CSS 文件进行编辑.或者打断点调试的时候 可能会发现 所有的操作都不生效,为什么? 原因可能存在以下情况 有时候可能会遇到js或者css文件引用后传 ...
- 线程 -- ThreadLocal
1,ThreadLocal 不是“本地线程”的意思,而是Thread 的局部变量.每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本 2, ...
- Spring - 事务管理概述
什么是事务管理? 第一个问题:什么是事务? 事务一般是相对数据库而言的,对于数据库一次操作就属于一个事务, 一次操作可以是几句 SQL 语句,也可以是若干行 JDBC 的 Java 语句.事务既然 ...
- IC设计流程概述
芯片设计分为前端设计和后端设计,前端设计(也称逻辑设计)和后端设计(也称物理设计)并没有统一严格的界限,涉及到与工艺有关的设计就是后端设计. Front-end design flow 1. 规格制定 ...