// /* // */ // #include // using namespace std; // // class T // // { // // public: // // T(int i=0):x(i){ c++;} // // ~T(){cout<num;//1 // // cout<*q;//2 // cout< #include #include using namespace std; int main() { int n, x, y, k; cin >> n >> x >> y >> k; vector a(n), b(n), c(n); for (int i = 0; i < n; ++i) cin >> a[i]; for (int i = 0; i < n; ++i) cin >> b[i]; for (int i = 0; i < n; ++i) cin >> c[i]; // dp[i][0]表示第i秒在上路的最大收益 // dp[i][1]表示第i秒在中路的最大收益 // dp[i][2]表示第i秒在下路的最大收益 vector> dp(n + 1, vector(3, 0)); // 初始状态:第0秒,小明在中路 dp[0][1] = 0; // 在中路 for (int i = 1; i <= n; ++i) { // 在上路的最大收益 dp[i][0] = max(dp[i-1][0], dp[i-1][1] - x) + a[i-1]; if (x <= k) { dp[i][0] = max(dp[i][0], dp[i-1][1] + a[i-1] / 2); } // 在中路的最大收益 dp[i][1] = max({dp[i-1][1], dp[i-1][0] - x, dp[i-1][2] - y}) + b[i-1]; if (x <= k) { dp[i][1] = max(dp[i][1], dp[i-1][0] + b[i-1] / 2); } if (y <= k) { dp[i][1] = max(dp[i][1], dp[i-1][2] + b[i-1] / 2); } // 在下路的最大收益 dp[i][2] = max(dp[i-1][2], dp[i-1][1] - y) + c[i-1]; if (y <= k) { dp[i][2] = max(dp[i][2], dp[i-1][1] + c[i-1] / 2); } } // 结果是第n秒时,在三条路上获得的最大收益 long long max_coins = max({dp[n][0], dp[n][1], dp[n][2]}); cout << max_coins << endl; return 0; } // int main() { // int n, x, y, k; // cin >> n >> x >> y >> k; // vector a(n), b(n), c(n); // for (int i = 0; i < n; ++i) cin >> a[i]; // for (int i = 0; i < n; ++i) cin >> b[i]; // for (int i = 0; i < n; ++i) cin >> c[i]; // // dp[i][0]表示第i秒在上路的最大收益 // // dp[i][1]表示第i秒在中路的最大收益 // // dp[i][2]表示第i秒在下路的最大收益 // vector> dp(n + 1, vector(3, 0)); // // 初始状态:第0秒,小明在中路 // dp[0][1] = 0; // 在中路 // for (int i = 1; i <= n; ++i) { // // 在上路的最大收益 // dp[i][0] = max(dp[i-1][0], dp[i-1][1] - x) + a[i-1]; // if (x <= k) { // dp[i][0] = max(dp[i][0], dp[i-1][1] + a[i-1] / 2); // } // // 在中路的最大收益 // dp[i][1] = max({dp[i-1][1], dp[i-1][0] - x, dp[i-1][2] - y}) + b[i-1]; // if (x <= k) { // dp[i][1] = max(dp[i][1], dp[i-1][0] + b[i-1] / 2); // } // if (y <= k) { // dp[i][1] = max(dp[i][1], dp[i-1][2] + b[i-1] / 2); // } // // 在下路的最大收益 // dp[i][2] = max(dp[i-1][2], dp[i-1][1] - y) + c[i-1]; // if (y <= k) { // dp[i][2] = max(dp[i][2], dp[i-1][1] + c[i-1] / 2); // } // } // // 结果是第n秒时,在三条路上获得的最大收益 // long long max_coins = max({dp[n][0], dp[n][1], dp[n][2]}); // cout << max_coins << endl; // return 0; // }