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 (); //} }