dp (E. Dormir annexe)

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

  

Je suppose que tu aimes

Origine www.cnblogs.com/nonames/p/12484091.html
conseillé
Classement