#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n, k;
cin >> n >> k;
vector<ll> a(n + 1), b(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
vector<vector<ll>> dp(n + 1, vector<ll>(2, -1e18));
dp[1][0] = a[1]; // 起始在表世界1号点
for (int i = 2; i <= n; i++) {
// 从表世界 i-1 走到表世界 i
if (dp[i - 1][0] != -1e18) {
dp[i][0] = max(dp[i][0], dp[i - 1][0] + a[i]);
}
// 从里世界 i-1 走到里世界 i
if (dp[i - 1][1] != -1e18) {
dp[i][1] = max(dp[i][1], dp[i - 1][1] + b[i]);
}
// 从表世界 i-1 跃迁到里世界 i
if (dp[i - 1][0] != -1e18 && dp[i - 1][0] >= k) {
dp[i][1] = max(dp[i][1], dp[i - 1][0] - k + b[i]);
}
// 从里世界 i-1 跃迁到表世界 i
if (dp[i - 1][1] != -1e18 && dp[i - 1][1] >= k) {
dp[i][0] = max(dp[i][0], dp[i - 1][1] - k + a[i]);
}
}
cout << max(dp[n][0], dp[n][1]) << endl;
return 0;
}
动态规划

京公网安备 11010502036488号