CF EDU 103 C - Longest Simple Cycle
阿新 • • 發佈:2022-05-26
C - Longest Simple Cycle
dp
設 \(f[i]\) 為以第 \(i\) 個線段為環的右邊界,環的最大長度
不妨令 \(l = min(a[i],b[i]),r =max(a[i],b[i])\)
-
\(l\neq r\)
- 第 \(i-1\) 條線段的 \([l,r]\) 這部分作為環的左邊界,此時環的長度為 \(r-l+1+c[i]\)
- 不選第 \(i-1\) 條線段的 \([l,r]\) 這部分,與以第 $i-1 $ 條線段為右端點的環解上,此時環的長度為 \(f[i-1]-(r-l-1)+c[i]\)
-
\(l == r\)
只有策略 1 可以選,\(f[i]=c[i]+1\)
#include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath> using namespace std; typedef long long ll; const int N = 1e5 + 10; int n; ll c[N], a[N], b[N], f[N]; int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T; cin >> T; while(T--) { cin >> n; for (int i = 1; i <= n; i++) cin >> c[i]; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; f[1] = 0; for (int i = 2; i <= n; i++) { ll l = min(a[i], b[i]), r = max(a[i], b[i]); if (l == r) { f[i] = c[i] + 1; continue; } f[i] = max(r - l + 1, f[i-1] - (r - l - 1)) + c[i]; } cout << *max_element(f + 1, f + n + 1) << endl; } return 0; }