https://codeforces.ml/contest/1324/problem/E
La signification des problèmes: un h jour (3 <= h <= 2000) heures, n (1 <= n <= 2000) temps de sommeil, chaque fois par l'ai (1 <= ai <h) le temps de dormir, il y a deux sélectionné par l'AI-1 ai au fil du temps pour dormir ou de temps de sommeil, le temps de sommeil prêt à commencer [l, r] (0 <= l <= r <h) être un bon sommeil. Q. Jusqu'à quelques bon sommeil.
Solution: deux dimensions dp [i] [j] représente la i-ème sommeil, le temps est le plus grand bon sommeil j.
// # include <bits / stdc ++. h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithme> #include <iostream> #include <string> #include <stdio.h> #include <file> #include <stack> #include <carte> #include <set> #include <string.h> #include <vector> typedef long long ll; #define int ll #define mod 1000000007 #define gcd __gcd rep #define (i, j, n) pour (int i = j; i <= n; i ++) rouge #define (i, n, j) pour (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, tandis que (b) {if (b & 1) ans = ans * un mod%; b >> = 1, a = a * a mod%;} return ans;} // int euler1 (int x) {int x = ans; for (int i = 2; i * i <= x; i ++) if (x% i == 0) {= ans- ans / i; tandis que (x% i == 0) x / = i;} if (x> 1) = ans- ans / x; return ans;} // const int N = 1E7 + 9; int vis [n], le premier [n], phi [N]; int euler2 (int n) {ME (vis, true); int len = 1; rep (i, 2, n) {if (vis [i] ) {premier [len ++] = i, phi [i] = i-1;} for (int j = 1; j <len && [j] premier * i <= n; j ++) {vis [i * j prime []] = 0; if (i% premier [j] == 0) {phi [i * j premier []] = phi [i] * premier [j]; break;} else {phi [i * j premier []] = phi [i] * phi [premier j []];}}} return len} #define INF 0x3f3f3f3f #define PI acos (-1) #define pii paire <int, int> #define fi premier #define SE seconde # définir lson l, milieu, racine << 1 #define rson mi + 1, r, racine << #define mp make_pair #define cin (x) scanf ( "% lld", et x); using namespace std; const int N = 1E7 + 9; const int maxn = 2e3 + 9; const double - esp = 1E-6; int dp [maxn] [maxn]; int a [maxn]; annuler résoudre () { int n, h, l, r; cin >> >> n h >> l >> r; représentant (i, 1, n) { cin >> a [i]; } Représentant (i, 0, n) { rep (j, 0, h-1) { dp [i] [j] = -1; } } Dp [0] [0] = 0; pour (int i = 1; i <= n; i ++) { for (int j = 0; j <h; j ++) { if (dp [i-1] [j]! if (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; if (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; pour (int i = 0; i <h; i ++) { ans = max (ans, dp [n] [i]); } Cout << ans << endl; } { signé main () // ios :: sync_with_stdio (faux); //cin.tie(0); cout.tie (0); // int t; // cin >> t; // while (t -) { résoudre (); //} }
Mémoire de la récursivité:
#include <bits / stdc ++. h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithme> #include <iostream> #include <string> #include <stdio.h> #include <file d' attente > #include <stack> #include <carte> #include <set> #include <string.h> #include <vector> typedef long long ll; #define int ll #define mod 1000000007 #define gcd __gcd rep #define (i, j, n) pour (int i = j; i <= n; i ++) rouge #define (i, n, j) pour (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, tandis que (b) {if (b & 1) ans = ans * un 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) {= ans ans- / i, tandis que ( x% i == 0) x / = i;} if (x> 1) = ans- ans / x; return ans;} // const int N = 1E7 + 9; int vis [n], le premier [n], phi [N]; int euler2 (int n) {ME (vis, true); int len = 1; rep (i, 2, n) {if (vis [i] ) {premier [len ++] = i, phi [i] = i-1;} for (int j = 1; j <len && [j] premier * i <= n; j ++) {vis [i * j prime []] = 0; if (i% premier [j] == 0) {phi [i * j premier []] = phi [i] * premier [j]; break;} else {phi [i * j premier []] = phi [i] * phi [j premier []];}}} return} len #define SC scanf #define INF 0x3f3f3f3f #define PI ACOS (-1) #define PII paire <int, int> #define fi premier # définir soi deuxième #define lson l, milieu, racine << 1 #define rson mi + 1, r, using namespace std; const int N = 1e6 + 100; const int maxn = 2e3 + 9; int dp [maxn] [maxn]; int a [maxn]; int n, h, l, r; dfs int (int pos, somme int = 0) { if (pos> n) return 0; int & ret = dp [pos] [somme]; si (ret = -1!) retour dp [pos] [somme]; int c = (somme + a [pos] - 1)% de H; int d = (somme + a [pos])% h; int a = dfs (pos + 1, c) + (c> = l && c <= r); int b = dfs (pos + 1, d) + (d> = l && d <= r); retour dp [pos] [sum] = max (a, b); } Vide solve () { cin >> n >> h >> l >> r; représentant (i, 1, n) { cin >> a [i]; } rep (j, 0, h-1) { dp [i] [j] = -1; } } Cout << DSF (1) << endl; } Signé main () { // ios :: sync_with_stdio (false); //cin.tie(0); cout.tie (0); // int t; // cin >> t; // while (t -) { résoudre (); //} }