[Cf1204E] E. Natasha, Sasha y las sumas prefijo (combinación dp Matemáticas +)

portal

El significado de problemas:
el antes \ (n- \) un \ (. 1 \) , \ (m \) un \ (-. 1, n-, m \ Leq 2000 \) , para formar una secuencia de estos números, que se define \ [\ displaystyle f (a) = max (0 , max_ {1 \ leq i \ leq n + m} \ sum_ {j = 1} ^ ia_j) \]

Eso \ (f (a) \) secuencia \ (A \) de todos los prefijos y máximo.
La investigación final de todas las secuencias posibles \ (f (a) \) la suma de la cantidad.

ideas:

  • Observamos que la solicitud es un prefijo y. De acuerdo con esto se puede encontrar, si la secuencia actual \ (F (A) = X \) , a continuación, agregar una tapa \ (1 \) , entonces \ (F (A ') = 1 + X \) ; plus un \ (- 1 \) , entonces \ (F (a ') = max (0 ,. 1-X) \) .
  • Lo anterior es una observación muy importante, entonces podemos estar de acuerdo con \ (dp \) .
  • Definido \ (dp_ {x, y} \) representa la ahora \ (X \) un \ (1 \) , \ (Y \) un \ (- 1 \) respuestas. Entonces no es el tipo de transferencia:

\ [Dp_ {x, y} = dp_ {x-1, y} + {x-1 + y \ eligen y} + dp_ {x, y-1} - ({x + y-1 \ elegir x} - f_ {x, y-1}
) \] donde \ (F_ {x, y} \) significa que cuando hay \ (X \) un \ (1 \) , \ (Y \) un \ (- 1 \) cuando , \ (F (a) = 0 \) es el número de secuencia. Esto es equivalente a una cualquiera del prefijo \ (1 \) número no exceda de \ (- 1 \) , puede ser directamente calculado de acuerdo con los números de fórmula Cattleya.
Código está bien escrito, la clave para resolver este problema consiste en captar el "prefijo y" la idea de lo convencional \ (dp \) La diferencia es que esta vez elegimos a insertarse desde la parte delantera.
Código es el siguiente:

/*
 * Author:  heyuhhh
 * Created Time:  2020/3/14 15:52:51
 */
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#include <assert.h>
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
  #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  void err() { std::cout << '\n'; }
  template<typename T, typename...Args>
  void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  template <template<typename...> class T, typename t, typename... A> 
  void err(const T <t> &arg, const A&... args) {
  for (auto &v : arg) std::cout << v << ' '; err(args...); }
#else
  #define dbg(...)
#endif
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 4000 + 5, MOD = 998244853;

int C[N][N];
void init() {
    C[0][0] = 1;
    for(int i = 1; i < N; i++) {
        C[i][0] = 1;
        for(int j = 1; j <= i; j++) {
            C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;   
        }
    }
}

int n, m;
int f[N][N], g[N][N];

void run() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        f[0][i] = 1;
        for(int j = i; j <= m; j++) {
            f[i][j] = (C[i + j][i] - C[i + j][i - 1] + MOD) % MOD;
        }   
    }
    for(int i = 1; i <= n; i++) g[i][0] = i;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            g[i][j] = (g[i - 1][j] + C[i + j - 1][j]) % MOD + ((g[i][j - 1] - (C[i + j - 1][j - 1] - f[i][j - 1])) % MOD + MOD) % MOD;
            g[i][j] %= MOD;
        }   
    }
    cout << g[n][m] << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cout << fixed << setprecision(20);
    init();
    run();
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/heyuhhh/p/12507040.html
Recomendado
Clasificación