fork(3) download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define MAXNO 200
  5.  
  6. int mem[MAXNO][MAXNO][2];
  7.  
  8. int get(vector<int> v, int s, int e, int findMax) {
  9. if(mem[s][e][findMax] != -1) return mem[s][e][findMax];
  10.  
  11. if(e == s)
  12. return mem[s][e][findMax] = v[s];
  13. else if(e - s == 1)
  14. return mem[s][e][findMax] = v[s] - v[e];
  15.  
  16. int a = v[s] - get(v, s + 1, e, findMax);
  17. int b = v[s] - v[s + 1] - get(v, s + 2, e, findMax);
  18.  
  19. return mem[s][e][findMax] = (findMax ? max(a, b) : min(a, b));
  20. }
  21.  
  22. void reset() {
  23. for(int j = 0; j < MAXNO; j++) {
  24. for(int k = 0; k < MAXNO; k++) {
  25. for(int l = 0; l < 2; l++) {
  26. mem[j][k][l] = -1;
  27. }
  28. }
  29. }
  30. }
  31.  
  32. int main()
  33. {
  34. string tt;
  35. getline(cin,tt);
  36.  
  37. stringstream st(tt);
  38. int t;
  39. st >> t;
  40.  
  41. while(t--) {
  42. string s;
  43. getline(cin,s);
  44.  
  45. stringstream ss(s);
  46.  
  47. int ii;
  48. vector<int> v;
  49.  
  50. while(ss >> ii) {
  51. v.push_back(ii);
  52. }
  53.  
  54. if(v.size() == 1) {
  55. cout << v[0] << endl;
  56. } else {
  57. int ans = INT_MIN;
  58.  
  59. for(int i = 0; i < v.size() - 1; i++) {
  60. reset();
  61. int left = get(v, 0, i, 1);
  62.  
  63. reset();
  64. int right = get(v, i + 1, v.size() - 1, 0);
  65.  
  66. ans = max(ans, left - right);
  67. }
  68.  
  69. cout << ans << endl;
  70. }
  71. }
  72. }
Success #stdin #stdout 0s 15552KB
stdin
2
2 5 1 8
6 2 1
stdout
6
5