dp (E. Horario de dormir)

https://codeforces.ml/contest/1324/problem/E

El significado de problemas: un día h (3 <= h <= 2000) horas, n (1 <= n <= 2000) las horas de sueño, cada vez a través de la AI (1 <= ai <h) tiempo para dormir, hay dos seleccionan a través de la aI-1 ai con el tiempo para dormir o tiempo de sueño, tiempo de sueño listo para comenzar [l, r] (0 <= l <= r <h) ser buen sueño. P. Hasta unos pocos buen sueño.

Solución: dp de dos dimensiones [i] [j] representa el i-ésimo del sueño, el tiempo es de la mayor j buen sueño.

// # incluir <bits / STDC ++. h> 
#include <cstdio> 
#include <cstring> 
#include <cmath> 
#include <algoritmo> 
#include <iostream> 
#include <string> 
#include <stdio.h> 
#include <cola> 
#include <pila> 
#include <mapa> 
#include <set> 
#include <string.h> 
#include <vector> 
typedef largo largo ll; 
#define int ll 
#define mod 1000000007 
#define gcd __gcd 
#define rep (i, j, n) for (int i = j; i <= n; i ++) 
#define rojo (i, n, j) for (int i = n; i> = j; i--) 
#define mE (x, y) memset (x, y, sizeof (x)) 
// ll lcm (ll a,
// ll quickpow (ll a, ll b) {ll ans = 1, mientras que (b) {if (b & 1) ans = ans * a mod%; b >> = 1, a = a * a mod%;} return ans;} 
// int euler1 (int x) {int ans = x; for (int i = 2; i * i <= x; i ++) si (x% i == 0) {Respuesta-= ans / i; mientras que (x% i == 0) x / = i;} if (x> 1) Respuesta-= American National Standard / x; ans de retorno;} 
// const int N = 1E7 + 9; int VIS [n], el primer [n], phi [N]; int euler2 (int n) {ME (vis, true); int len = 1; rep (i, 2, n) {if (vis [i] ) {prime [len ++] = i, phi [i] = i-1;} for (int j = 1; j <len && prime [j] * i <= n; j ++) {vis [i * prime [j]] = 0; si (% prime i [j] == 0) {phi [i * prime [j]] = phi [i] * prime [j]; break;} else {phi [i * prime [j]] = phi [i] * phi [prime [j]];}}} len retorno} 
#define INF 0x3f3f3f3f 
#define acos PI (-1) 
#define pii par <int, int> 
#define fi primera 
#define SE segundo 
# definir LSON l, mediados, raíz << 1 
#define rson mediados + 1, r, raíz <<
#define mp make_pair 
#define cin (x) scanf ( "% LLD", y x); 
using namespace std; 
int const N = 1E7 + 9; 
const int maxN = 2E3 + 9; 
const doble esp = 1e-6; 
int dp [maxN] [maxN]; 
int a [maxN]; 

anular resolver () { 
    int n, h, l, r; 
    cin >> n >> h >> l >> r; 
    rep (i, 1, n) { 
        cin >> a [i]; 
    } 
    Rep (i, 0, n) { 
        rep (j, 0, h-1) { 
            dp [i] [j] = -1; 
        } 
    } 
    Dp [0] [0] = 0; 
    for (int i = 1; i <= n; i ++) { 
        for (int j = 0; j <h; j ++) { 
            si (dp [i-1] [j]!
                si (k> = l && k <= r) {
                    dp [i] [k] = max (dp [i] [k], dp [i-1] [j] + 1); 
                } else { 
                    dp [i] [k] = max (dp [i] [k], dp [i-1] [j]); 
                } 
                K = (j + a [i] - 1)% h; 
                si (k> = l && k <= r) { 
                    dp [i] [k] = max (dp [i] [k], dp [i-1] [j] + 1); 
                } else { 
                    dp [i] [k] = max (dp [i] [k], dp [i-1] [j]); 
                } 
            } 
        } 
    } 
    Int ans = -1; 
    for (int i = 0; i <h; i ++) { 
        ans = max (ans, dp [n] [i]); 
    } 
    Cout << ans << endl; 

} 
{

firmado main () 
    // ios :: sync_with_stdio (false); 
    //cin.tie(0); cout.tie (0); 
    // int t; 
    // cin >> t; 
    // tiempo (t -) { 
        solve (); 
    //} 
}

 

Memoria de la recursión:

#include <bits / STDC ++. h> 
#include <cstdio> 
#include <cstring> 
#include <cmath> 
#include <algoritmo> 
#include <iostream> 
#include <string> 
#include <stdio.h> 
#include <cola > 
#include <pila> 
#include <mapa> 
#include <set> 
#include <string.h> 
#include <vector> 
typedef largo largo ll; 
#define int ll 
#define mod 1000000007 
#define gcd __gcd 
#define rep (i, j, n) for (int i = j; i <= n; i ++) 
#define rojo (i, n, j) for (int i = n; i> = j; i--) 
#define mE (x, y) memset (x, y, sizeof (x)) 
// ll lcm (ll a,
ll quickpow (ll a, ll b) {ll ans = 1, mientras que (b) {if (b & 1) ans = ans * a mod%; b >> = 1, a = a * a mod%;} ans de retorno; } 
// int euler1 (int x) {int ans = x; for (int i = 2; i * i <= x; i ++) si (x% i == 0) {Respuesta-= ans / i; while ( x% i == 0) x / = i;} if (x> 1) Respuesta-= American National Standard / x; ans de retorno;} 
// const int N = 1E7 + 9; int VIS [n], el primer [n], phi [N]; int euler2 (int n) {ME (vis, true); int len = 1; rep (i, 2, n) {if (vis [i] ) {prime [len ++] = i, phi [i] = i-1;} for (int j = 1; j <len && prime [j] * i <= n; j ++) {vis [i * prime [j]] = 0; si (% prime i [j] == 0) {phi [i * prime [j]] = phi [i] * prime [j]; break;} else {phi [i * prime [j]] = phi [i] * phi [prime [j]];}}} len retorno} 
#define SC scanf 
#define INF 0x3f3f3f3f 
#define acos PI (-1) 
#define pii par <int, int> 
#define fi primera 
# definir SE segundo 
#define LSON l, mediados, raíz << 1 
#define rson mediados + 1, r,
using namespace std; 
int const N = 1E6 + 100; 
const int maxN = 2E3 + 9; 
int dp [maxN] [maxN]; 
int a [maxN]; 
int n, h, l, r; 
dfs int (pos int, int suma = 0) { 
    si (pos> n) return 0; 
    int & ret = dp [pos] [suma]; 
    si (r = -1!) de retorno dp [pos] [suma]; 
    int c = (suma + a [pos] - 1)% H; 
    int d = (suma + a [pos])% h; 
    int a = DFS (pos + 1, c) + (c> = l && c <= r); 
    int b = dfs (pos + 1, d) + (d> = l && d <= r); 
    regreso dp [pos] [suma] = max (a, b); 
} 

Void resolver () { 

    cin >> n >> h >> l >> r; 
    rep (i, 1, n) { 
        cin >> a [i]; 
    }
        rep (j, 0, h-1) { 
            dp [i] [j] = -1; 
        } 
    } 
    Tribunal << dfs (1) << endl; 
} 

Firmado main () 
{ 
    // ios :: sync_with_stdio (false); 
    //cin.tie(0); cout.tie (0); 
    // int t; 
    // cin >> t; 
    // tiempo (t -) { 
        solve (); 
    //} 
}

  

Supongo que te gusta

Origin www.cnblogs.com/nonames/p/12484091.html
Recomendado
Clasificación