题面:
解题思路:
首先定义状态dp[i][j]表示序列ai和序列bj的最长公共上升子序列的长度
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <vector> #include <map> #include <cmath> #include <queue> using namespace std; #define MAX_N 3000 int a[MAX_N + 5], b[MAX_N + 5]; int ans = 0; int dp[MAX_N + 5][MAX_N + 5]; int main() { int n; 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++) { dp[i][j] = dp[i][j - 1]; if (a[i] - b[j]) continue; dp[i][j] = max(1, dp[i][j]); for (int k = 1; k < i; k++) { if (a[k] >= a[i]) continue; dp[i][j] = max(dp[i][j], dp[k][j - 1] + 1); } ans = max(ans, dp[i][j]); } } cout << ans << endl; return 0; }
标签:int,MAX,HZOJ,ans,序列,include,最长,dp From: https://www.cnblogs.com/anaxiansen/p/17012295.html