DP(E。眠れる森のスケジュール)

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

問題の意味:1日の時間(3 <= H <= 2000)時間、N(1 <= N <= 2000)睡眠時間、毎時間Al(1 <= aiを<H)は、時間を経てスリープ状態に二つがありますAI-1を開始する準備ができて睡眠時間、睡眠または睡眠時間までの時間にわたって愛[L、R](0 <= L <= R <H)を介して良好な睡眠である選択。いくつかの良い睡眠へQ.アップ。

ソリューション:2次元DP [i] [j]は、i番目の睡眠を表し、時間が最大の良い睡眠Jのです。

//#<ビット/ STDC ++。H>含みます
書式#include <cstdioを>
書式#include <CStringの>
書式#include <cmath>
書式#include <アルゴリズム>
書式#include <iostreamの>
書式#include <文字列>
書式#include <stdio.hに>
書式#include <キュー>
書式#include <スタック>
書式#include <マップ>
書式#include <セット>
書式#include <string.hの>
書式#include <ベクトル>
長い長いLLのtypedef。
#define int型LL
#defineモッズ十億七
#define GCD __gcd
#define REPは(I、J、N)のための(INT iはjは=; I <= N; I ++)
#defineは、赤色(I、N、j)のための(INT I = N; I> = J; i--)
#define ME(x、y)はmemsetの(X、Y、はsizeof(x))を
// LL LCM(-1,11,11- B){* B / GCD(A、B)を返します;}
一方、(B){IF(B&1)ANS = ANS *%のMOD; //は(-1,11,11- B){LL ANS = 1をquickpowちゃうB >> = 1、A = A *%のMOD;}リターンANS;}
// INT euler1(INT X){int型ANS = X;のために(INT iが= 2、iは<= X *; I ++)IF(X%I == 0){ans- = ANS / I、一方(X %I == 0)は、x / = I;}もし(X> 1)ans- = ANS / X;戻りANS;}
// CONST INT N = 1E7 + 9。INT VIS [n]は、素数[n]は、PHI [N]; int型euler2(INT N){ME(VIS、TRUE); INT LEN = 1;担当者(I、2、N){IF(VIS [I] ){プライム[LEN ++] = I、PHI [i]は= I-1;}の(INT J = 1; J <LEN &&プライム[J] * I <= nであり、j ++){VIS [i *が素数[J] = 0;(I%プライム[j] == 0){;ブレーク; PHI [I *プライム[J] = PHI [I] *プライム[J]}もしそうでなければ{PHI [iが素数[Jを*]] = PHI [I] * PHI [プライム[J]];}}}戻りLEN}
#define INF 0x3f3f3f3f
#define PIのACOS(-1)
#define PIIペア<int型、int型>
#define Fiの最初の
#define SE秒
#define LSONリットル、ミッド、根<< 1
#define rson半ば+ 1、R、根<< 1 | 1
#define PB一back
#define融点make_pair
#define CIN(X)のscanf( "%のLLD"、&x)は、
名前空間stdを使用。
CONST INT N = 1E7 + 9。
const int型MAXN = 2E3 + 9。
CONSTダブルESP = 1E-6。
int型DP [MAXN] [MAXN]。
[MAXN] int型。

ボイドは、{()解決します
    INT、N、H、L、R。
    CIN >> N >> H >> L >> R。
    担当者(I、1、N){
        CIN >> [i]は、
    }
    担当者(I、0、N){
        担当者(j、0、H-1){
            DP [I] [J] = -1。
        }
    }
    DP [0] [0] = 0;
    以下のために(INT I 1 =; I <= N; I ++){
        用(INT J = 0であり、j <H、J ++){
            IF(DP [I-1]〜[J]!= -1){
                INT K =(J + [I])%のH。
                もし(K> = L && K <= R){
                    DP [I] [K] = MAX(DP [I] [K]、DP [I-1]〜[J] + 1)。
                }そうしないと{
                    DP [I] [K] = MAX(DP [I] [K]、DP [I-1]〜[J])。
                }
                K =(J + [I]  -  1)%のH。
                もし(K> = L && K <= R){
                    DP [I] [K] = MAX(DP [I] [K]、DP [I-1]〜[J] + 1)。
                }そうしないと{
                    DP [I] [K] = MAX(DP [I] [K]、DP [I-1]〜[J])。
                }
            }
        }
    }
    INT年= -1;
    以下のために(; I <H、INT iが0 = I ++){
        ANS = MAX(ANS、DP [n]は[I])。
    }
    coutの<< ANS <<てendl;

}

主符号付き()
{
    // IOS :: sync_with_stdio(偽);
    //cin.tie(0); cout.tie(0)。
    // int型トン。
    // cinを>>トン。
    //一方、(T  - ){
        解決する();
    //}
}

 

再帰のメモリ:

#include <ビット/ STDC ++。H>
書式#include <cstdioを>
書式#include <CStringの>
書式#include <cmath>
書式#include <アルゴリズム>
書式#include <iostreamの>
書式#include <文字列>
書式#include <stdio.hに>
書式#include <キュー>
書式#include <スタック>
書式#include <マップ>
書式#include <セット>
書式#include <string.hの>
書式#include <ベクトル>
長い長いLLのtypedef。
#define int型LL
#defineモッズ十億七
#define GCD __gcd
#define REPは(I、J、N)のための(INT iはjは=; I <= N; I ++)
#defineは、赤色(I、N、j)のための(INT I = N; I> = J; i--)
#define ME(x、y)はmemsetの(X、Y、はsizeof(x))を
// LL LCM(-1,11,11- B){* B / GCD(A、B)を返します;}
一方、(B){IF(B&1)ANS = ANS *%のMOD;(-1,11,11- B){LL ANS = 1をquickpowちゃうB >> = 1、A = A *%のMOD;}戻りANSを、 }
// INT euler1(INT X){int型ANS = X;のために(INT iが= 2、iは<= X *; I ++)IF(X%I == 0){ans- = ANS / I、一方(X %I == 0)は、x / = I;}もし(X> 1)ans- = ANS / X;戻りANS;}
// CONST INT N = 1E7 + 9。INT VIS [n]は、素数[n]は、PHI [N]; int型euler2(INT N){ME(VIS、TRUE); INT LEN = 1;担当者(I、2、N){IF(VIS [I] ){プライム[LEN ++] = I、PHI [i]は= I-1;}の(INT J = 1; J <LEN &&プライム[J] * I <= nであり、j ++){VIS [i *が素数[J] = 0;(I%プライム[j] == 0){;ブレーク; PHI [I *プライム[J] = PHI [I] *プライム[J]}もしそうでなければ{PHI [iが素数[Jを*]] = PHI [I] * PHI [プライム[J]];}}}戻りLEN}
#defineのSCのscanf
#define INF 0x3f3f3f3f
#define PIのACOS(-1)
#define PIIペア<int型、int型>
#define Fiの最初の
#define SE秒
#define LSONリットル、ミッド、根<< 1
#define rson半ば+ 1、R、根<< 1 | 1
名前空間stdを使用。
CONST INT N = 1E6 + 100。
const int型MAXN = 2E3 + 9。
int型DP [MAXN] [MAXN]。
[MAXN] int型。
INT、N、H、L、R。
INT DFS(int型のPOS、INT和= 0){
    (POS> n)が0を返す場合、
    INT&RET = DP [POS] [合計]。
    (!RET = -1)戻りDP [POS] [合計]の場合、
    INT C =(和+ [POS]  -  1)%のH。
    INT D =(和+ [POS])%のH。
    INT A = DFS(POS + 1、C)+(C> = L && C <= R)
    INT B = DFS(POS + 1、D)+(D> = L && D <= R)
    戻りDP [POS] [和] = MAX(A、B)。
}

ボイドは、{()解決します

    CIN >> N >> H >> L >> R。
    担当者(I、1、N){
        CIN >> [i]は、
    }
    担当者(I、0、N){
        担当者(j、0、H-1){
            DP [I] [J] = -1。
        }
    }
    COUT << DFS(1)<< ENDL。
}

主符号付き()
{
    // IOS :: sync_with_stdio(偽);
    //cin.tie(0); cout.tie(0)。
    // int型トン。
    // cinを>>トン。
    //一方、(T  - ){
        解決する();
    //}
}

  

おすすめ

転載: www.cnblogs.com/nonames/p/12484091.html