题解:P10954 LCIS【数据暂时有误】
题意:
给出两个数组
解答
首先想到
定义状态
表示第一个数组中前
转移方程
当
当
即
code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int n, a[N], b[N], dp[N][N], ans;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
if (a[i] == b[j])
for (int k = 1; k < j; k++){
if (b[k] < b[j])
dp[i][j] = max(dp[i][j], dp[i - 1][k] + 1);
}
else dp[i][j] = dp[i - 1][j];
ans = max(ans, dp[i][j]);
}
cout << ans << endl;
return 0;
}
时间复杂度
for (int k = 1; k < j; k++){
if (b[k] < b[j])
dp[i][j] = max(dp[i][j], dp[i - 1][k] + 1);
}
这一部分时间复杂度较高, 可以优化.
最终code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int n, a[N], b[N], dp[N][N], ans;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
for (int i = 1; i <= n; i++) {
int maxv = dp[i - 1][0];
for (int j = 1; j <= n; j++) {
if (a[i] == b[j]) dp[i][j] = maxv + 1;
else dp[i][j] = dp[i - 1][j];
if (b[j] < a[i]) maxv = max(maxv, dp[i - 1][j]);
ans = max(ans, dp[i][j]);
}
}
cout << ans << endl;
return 0;
}