Thursday 27 July 2017

Lightoj 1031 Easy Game

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int inf = 1 << 30;
  4. const int MN = 111;
  5. int dp[MN][MN];
  6. bool seen[MN][MN];
  7. int go(const vector<int> &nums, int i, int j) {
  8.   if (> j)
  9.     return 0;
  10.   if (== j)
  11.     return nums[i];
  12.   if (seen[i][j])
  13.     return dp[i][j];
  14.   seen[i][j] = true;
  15.   int accum = 0;
  16.   int best = -inf;
  17.   for (int k = i; k <= j; ++k) {
  18.     accum += nums[k];
  19.     best = max(best, accum - go(nums, k + 1, j));
  20.   }
  21.   accum = 0;
  22.   for (int k = j; k >=  i; --k) {
  23.     accum += nums[k];
  24.     best = max(best, accum - go(nums, i, k - 1));
  25.   }
  26.   return dp[i][j] = best;
  27. }

  28. void solve() {
  29.   int n;
  30.   cin >> n;
  31.   vector<int> nums(n);
  32.   for (int i = 0; i < n; ++i) {
  33.     cin >> nums[i];
  34.   }
  35.   memset(seen, 0sizeof seen);
  36.   printf("%d\n", go(nums, 0, n - 1));
  37. }

  38. int main() {
  39.   int tc;
  40.   cin >> tc;
  41.   for (int i = 0; i < tc; ++i) {
  42.     printf("Case %d: ", i + 1);
  43.     solve();
  44.   }
  45.   return 0;
  46. }
  47.  

No comments:

Post a Comment

Most Featured Post

Lightoj 1159 - Batman

http://lightoj.com/volume_showproblem.php?problem=1159 problem analysis: First i thought of this as if s1, s2 and s3 are those three str...