P10954 LCIS 题目解析
1.P1779 魔鬼杀手 题解&&思路2.SP15637 GNYR04H - Mr Youngs Picture Permutations 解析
3.P10954 LCIS 题目解析
4.P2893 [USACO08FEB] Making the Grade G 题目分析5.P10972 I-Country 题目分析6.SP703 SERVICE - Mobile Service 题目分析7.整数划分 题目分析以及衍生出来的一系列做法8.UVA1482 Playing With Stones 题目分析9.P2575 高手过招 题目分析10.P6815 [PA2009] Cakes 题目分析11.[AGC006D] Median Pyramid Hard 题目分析P10954 LCIS 题目解析
思路
前置:弱化版
没什么好说的,设 \(f_{i,j}\) 表示 \(a\) 的前 \(i\) 个并且结尾为 \(b_j\) 的最长上升公共子序列。
定义 \(a_0=b_0=-\infty.\)
转移:
- \(a_i=b_j,f_{i,j}=\max_{k\in [0,j-1]\text{ 且 }b_k < a_i} f_{i-1,k}.\)
- 否则,\(f_{i,j}=f_{i-1,j}.\)
于是有了以下代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#include <climits>
#define N 3005
#define int long long
using namespace std;
int n,m,a[N],b[N],f[N][N],ans;
signed main(){
cin >> n;
for (int i = 1;i <= n;i ++) cin >> a[i];
// cin >> m;
m = n;
for (int i = 1;i <= m;i ++) cin >> b[i];
a[0] = b[0] = -LONG_LONG_MAX;
for (int i = 1;i <= n;i ++) {
for (int j = 1;j <= m;j ++) {
if (a[i] == b[j]) {
for (int k = 0;k < j;k ++)
if (b[k] < a[i])
f[i][j] = max(f[i - 1][k] + 1,f[i][j]);
}
else f[i][j] = f[i - 1][j];
ans = max(ans,f[i][j]);
}
}
cout << ans;
return 0;
}
我们发现直接过掉了,但这样的时间复杂度是 \(\mathcal{O}(n^3)\) 的。
考虑免去一些重复的取 \(\max\) 值。
设决策 \(S(i,j)\) 为此次 \(f_{i,j}\) 的决策。
我们发现 \(b_k<a_i\) 中的 \(a_i\) 在某种程度上来讲是一个定值。
因此我们可以在枚举 \(i\) 的时候就把决策取入一个变量 \(mx\) 里面,当有满足 \(b_j<a_i\) 时,再加入进去(这是因为下一次 \(j+1\) 会有 \(j\) 的决策点 )。
时间复杂度 \(\mathcal{O}(n^2)\),正确地通过了本题。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#include <climits>
#define N 3005
#define int long long
using namespace std;
int n,m,a[N],b[N],f[N][N],ans;
signed main(){
cin >> n;
for (int i = 1;i <= n;i ++) cin >> a[i];
// cin >> m;
m = n;
for (int i = 1;i <= m;i ++) cin >> b[i];
a[0] = b[0] = -LONG_LONG_MAX;
for (int i = 1;i <= n;i ++) {
int mx = 0;
if (b[0] < a[i]) mx = f[i - 1][0];
for (int j = 1;j <= m;j ++) {
if (a[i] == b[j]) f[i][j] = mx + 1;
else f[i][j] = f[i - 1][j];
ans = max(ans,f[i][j]);
if (b[j] < a[i]) mx = max(mx,f[i - 1][j]);
}
}
cout << ans;
return 0;
}
本文作者:high_skyy
本文链接:https://www.cnblogs.com/high-sky/p/18534158
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
,
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步