|
|
// /*
// */
// #include <iostream>
// using namespace std;
// // class T
// // {
// // public:
// // T(int i=0):x(i){ c++;}
// // ~T(){cout<<c<<"_";c--;}
// // private:
// // static int c;
// // int x;
// // };
// // int T::c=0;
// // int main()
// // {
// // T *p2=new T(123);
// // delete p2;
// // T p1[3]={1,2,3};
// // return 0;
// // }
// class P
// {
// public:
// P(int i=0,int j=0):X(i),Y(j){num++;}
// int GetX(){return X;}
// int GetY(){return Y;}
// void show(){cout<<X<<" "<<Y<<"_";}
// static int num;
// private:int X,Y;
// };
// int P::num=0;
// int main(){
// P D(1,2),*j=&D;
// int *q=&P::num;
// cout<<j->num;//1
// // cout<<j->*q;//2
// cout<<P::num;//3
// cout<<P::*q; //4
// return 0;
// }
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; int main() { int n, x, y, k; cin >> n >> x >> y >> k; vector<int> 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<vector<long long>> dp(n + 1, vector<long long>(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<int> 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<vector<long long>> dp(n + 1, vector<long long>(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;
// }
|