1 solutions
-
0
// 暴力解法 #include <iostream> using namespace std; const int N = 3100; int a[N], b[N]; int n; int f[N][N]; int main () { cin >> n; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i <= n; i ++) cin >> b[i]; int ans = 0; for (int i = 1; i <= n; i ++) { // a for (int j = 1; j <= n; j ++) { // b f[i][j] = f[i - 1][j]; int tmp = 0; if (a[i] == b[j]) { tmp = 1; for (int k = 1; k < i; k ++) { for (int z = 1; z < j; z ++) { if(a[k] == b[z] && b[j] > b[z]) { tmp = max(tmp, f[k][z] + 1); } } } } f[i][j] = max(f[i][j], tmp); ans = max(ans, f[i][j]); } } cout << ans << endl; return 0; }
// 等价变换,最值维护优化 #include <iostream> using namespace std; const int N = 3100; int a[N], b[N]; int n; int f[N][N]; int main () { cin >> n; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i <= n; i ++) cin >> b[i]; // f[i][j] 表示 a(1~i) , b(1~j),必然以 a[i] 为结尾的最长上升公共子序列 int ans = 0; for (int i = 1; i <= n; i ++) { // a int tmp = 0; for (int j = 1; j <= n; j ++) { // b // 答案在前一行,维护前一行的最值 if (a[i] > b[j]) tmp = max(tmp, f[i - 1][j] + 1); int ret = 0; if (a[i] == b[j]) { ret = max(1, tmp); // 若此处相等,则说明可从前一行的最大上升子序列处进行转移。 } f[i][j] = max(f[i - 1][j], ret); // 与上一位置取最值 ans = max(ans, f[i][j]); } } cout << ans << endl; return 0; }
Information
- ID
- 2
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- (None)
- # Submissions
- 22
- Accepted
- 1
- Uploaded By