You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.7 KiB
135 lines
3.7 KiB
// /*
|
|
|
|
// */
|
|
// #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;
|
|
// }
|