fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define endl '\n'
  4. #define int long long int
  5. const int MOD = 1000000007;
  6. const int MOD2 = 998244353;
  7. const int INF = LLONG_MAX / 2;
  8. const int MAXN = 100000;
  9. int primes[1000000];
  10.  
  11. /*void seive() {
  12.   fill(primes, primes + 1000000, 1);
  13.   primes[0] = primes[1] = 0;
  14.   for (int i = 2; i * i < 1000000; i++) {
  15.   if (primes[i]) {
  16.   for (int j = i * i; j < 1000000; j += i) {
  17.   primes[j] = 0;
  18.   }
  19.   }
  20.   }
  21. }
  22.  
  23. bool isPrime(int n) {
  24.   if (n <= 1) return false;
  25.   for (int i = 2; i * i <= n; i++) {
  26.   if (n % i == 0) return false;
  27.   }
  28.   return true;
  29. }
  30.  
  31. int gcd(int a, int b) {
  32.   if (a == 0) return b;
  33.   return gcd(b % a, a);
  34. }*/
  35.  
  36. int power(int a, int b, int mod) {
  37. int res = 1;
  38. a %= mod;
  39. while (b > 0) {
  40. if (b & 1) res = res * a % mod;
  41. a = a * a % mod;
  42. b >>= 1;
  43. }
  44. return res;
  45. }
  46.  
  47. // nCr % MOD for n < MOD
  48. int nCrModP(int n, int r) {
  49. if (r > n) return 0;
  50. if (r == 0 || r == n) return 1;
  51.  
  52. int numerator = 1, denominator = 1;
  53. for (int i = 0; i < r; i++) {
  54. numerator = (numerator * (n - i)) % MOD;
  55. denominator = (denominator * (i + 1)) % MOD;
  56. }
  57. return (numerator * power(denominator, MOD - 2, MOD)) % MOD;
  58. }
  59.  
  60. // Lucas's Theorem
  61. int lucas(int n, int r) {
  62. if (r == 0) return 1;
  63. return (lucas(n / MOD, r / MOD) * nCrModP(n % MOD, r % MOD)) % MOD;
  64. }
  65. void solve() {
  66. int n;
  67. cin>>n;
  68. int A[n],B[n],C[n];
  69. for(int i = 0 ; i<n ; i++){
  70. cin>>A[i];
  71. }
  72. for(int i = 0 ; i<n ; i++){
  73. cin>>B[i];
  74. }
  75. for(int i = 0 ; i<n ; i++){
  76. cin>>C[i];
  77. }
  78. int dpeasy[n],dpmed[n],dphard[n];
  79. dpeasy[0] = A[0];
  80. dpmed[0] = B[0];
  81. dphard[0] = C[0];
  82. dpeasy[1] = A[1]+max({A[0],B[0],C[0]});
  83. dpmed[1] = B[1]+max({A[0],B[0],C[0]});
  84. dphard[1] = C[1]+max({A[0],B[0],C[0]});
  85. dpeasy[2] = A[2]+max({dpeasy[1],dpmed[1],dphard[1]});
  86. dpmed[2] = B[2]+A[1]+B[0];
  87. dphard[2] = C[2]+max({dpeasy[1],dpmed[1],dphard[1]})+A[0];
  88. for(int i = 3 ; i<n ; i++){
  89. dpeasy[i] = A[i]+max({dpeasy[i-1],dpmed[i-1],dphard[i-1]});
  90. dpmed[i] = B[i]+A[i-1]+dpmed[i-2];
  91. dphard[i] = C[i]+A[i-1]+dpeasy[i-2];
  92. dphard[i] = max(dphard[i],(C[i]+B[i-1]+A[i-2]+dpmed[i-3]));
  93. dphard[i] = max(dphard[i],(C[i]+C[i-1]+A[i-2]+dpeasy[i-3]));
  94. }
  95. cout<<max({dpeasy[n-1],dpmed[n-1],dphard[n-1]})<<endl;
  96. }
  97. signed main() {
  98. ios::sync_with_stdio(false); cin.tie(NULL);
  99. int t;
  100. cin >> t;
  101. while (t--) {
  102. solve();
  103. }
  104. return 0;
  105. }
  106.  
Success #stdin #stdout 0.01s 5320KB
stdin
1
5
1
2
3
4
5
2
4
6
8
10
3
6
9
12
15
stdout
35