fork(1) download
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3. using namespace std;
  4. #define INF numeric_limits<ll>::max()
  5.  
  6. ll dp[2][100050];
  7.  
  8. ll go(ll val, ll i, ll s, ll b[], ll n, ll dp[][100050])
  9. {
  10.  
  11. if(i==n)
  12. {
  13. return s;
  14. }
  15.  
  16. if(dp[val][i]!=-1)
  17. {
  18. return dp[val][i];
  19. }
  20.  
  21. if(val == 0)
  22. {
  23. ll x = abs(b[i] - b[i-1]);
  24. ll y = abs(1 - b[i-1]);
  25. ll sum = 0;
  26. sum = sum + max(go(0, i+1, s+x, b, n, dp), go(1, i+1, s+y, b, n, dp));
  27. return dp[val][i] = sum;
  28. }
  29.  
  30. else if(val==1)
  31. {
  32. ll x = abs(b[i] - 1);
  33. ll sum = 0;
  34. sum = sum + max(go(0, i+1, s+x, b, n, dp),go(1, i+1, s, b, n, dp));
  35. return dp[val][i] = sum;
  36. }
  37. }
  38.  
  39. int main()
  40. {
  41. ll t;
  42. cin>>t;
  43. while(t--)
  44. {
  45. ll n;
  46. cin>>n;
  47. ll b[n];
  48. for(ll x=0; x<n; x++)
  49. {
  50. cin>>b[x];
  51. }
  52. memset(dp, -1, sizeof(dp));
  53. cout<<max(go(0, 1, 0, b, n, dp), go(1, 1, 0, b, n, dp))<<endl;
  54. }
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0s 4988KB
stdin
5
5
10 1 10 1 10
3
1 2 3
5
100 2 100 2 100
25
52 60 50 90 84 35 56 64 52 20 43 19 12 73 48 93 43 78 22 53 60 100 26 54 84
12
39 99 55 47 17 53 86 33 95 72 45 56
stdout
9
2
99
106
88