1 条题解
-
-4
beyond 这题想了3个小时,才有所感悟
- 当a[i] != b[j] 时,f[i][j] = f[i-1][j]。
- 当 a[i] == b[j] 时,f[i][j] = max(f[i-1][k] + 1),其中 1 <= k < j 且 b[k] < b[j]。
- 此代码亦可优化
- 我们可以像优化0/1背包问题利用滚动数组来优化空间。
- 原因是每次用到的只是上一层循环用到的值,即f[i-1][j]
- 但不想在改了
#include <iostream> #include <algorithm> using namespace std; const int N = 2001; int a[N], b[N], f[N][N]; int LCIS(int n, int m) { int ans = 0; for (int i = 0; i < n; ++i) { int maxv = 0; for (int j = 0; j < m; ++j) { f[i+1][j+1] = f[i][j+1]; if (a[i] == b[j]) { for (int k = 0; k < j; ++k) { if (b[j] > b[k]) { maxv = max(maxv, f[i][k+1]); } } f[i+1][j+1] = maxv + 1; } ans = max(ans, f[i+1][j+1]); } } return ans; } int main() { freopen("lcis.in","r",stdin); freopen("lcis.out","w",stdout); int n; cin >> n; for (int i = 0; i < n; ++i) cin >> a[i]; for (int i = 0; i < n; ++i) cin >> b[i]; cout << LCIS(n, n) << endl; return 0; }
- 1
信息
- ID
- 551
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 152
- 已通过
- 10
- 上传者