[HNOI2004] Arkanoid

luoguP2291 [HNOI2004] Breakout

Set \ (f [i] [j ] [k] \) represents \ (I \) before the column knock \ (J \) a brick, a total knock \ (K \) th maximum bricks obtained benefits.
and section \ (I \) state and only the column \ (i + \ 1) the state of the relevant column.
so we backwards \ (DP \) .
\ (F [I] [J] [K] = \ max {(f [i]
[j] [k], \ f [i \ + \ 1] [t] [k \ - \ j])} \) and avoiding regardless of the state transition, we \ (F \ ) array initial value assigned to \ (- inf \)

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define il inline
#define rg register
#define gi read<int>
using namespace std;
const int O = 55;
template<class TT>
il TT read() {
  TT o = 0, fl = 1; char ch = getchar();
  while (!isdigit(ch)) fl ^= ch == '-', ch = getchar();
  while (isdigit(ch)) o = o * 10 + ch - '0', ch = getchar();
  return fl ? o : -o;
}
int n, m, ans, a[O][O], s[O][O], f[O][O][O*O];
int main() {
  memset (f, -1, sizeof f);
  n = gi(), m = gi();
  for (int i = 1; i <= n; ++i)
      for(int j = 1; j <= n - i + 1; ++j)
          a[i][j] = gi();
  for (int i = 1; i <= n; ++i)
      for (int j = 1; j <= n - i + 1; ++j)
          s[i][j] = s[i][j - 1] + a[j][i];
  f[n + 1][0][0] = 0;
  for (int i = n; i; --i) {
      for (int j = 0; j <= n - i + 1; ++j)
          for (int k = j; k <= min(m, (n - i + 1) * (n - i + 2) >> 1); ++k)
              for (int t = j ? j - 1 : 0; t <= n - i; ++t)
                  if (f[i + 1][t][k - j] >= 0){
                      f[i][j][k] = max(f[i][j][k], s[i][j] + f[i + 1][t][k - j]);
                      ans = max(ans, f[i][j][k]);
                  }
  }
  printf("%d\n", ans);
  return 0;
}

Guess you like

Origin www.cnblogs.com/lylyl/p/11668154.html