2019 가축 오프 더 학교 첫번째

2019 가축 오프 더 학교 첫번째

E : ABBA (욕심 + DP)

  • 질문의 의미가 \ (n \) 는 "AB", \ (m의 \) 는 "BA", 그리고 시퀀스로 결합 될 수 있습니다 얼마나 많은 물었다. 이 요건 즉 AB 및 BA의 순서이고, A 및 B 상수의 상대적 위치. 우리는 법적 지위가 무엇인지 논의하고자합니다.

  • 욕심 :
    • 단이라고 가정 \ (\ N-) AB 차 합법적 상황은 각 B의 전면하는 것이다 \ (\ 1 ... N) 번째
    • 가정하자 AB뿐만 아니라 이외에 \ (m의 \) 바륨, 각 B 앞 그 이상 가질 수있다 (\ N- \) 다 th를 먼저 또는 전방 B를 가지고 \ (1 ... n \) 번째 A. 그렇지 않으면 B 형 BA의 뒷면은 A.하지 않았다
    • A 및 B는 (A)의 하나에 대응하는 오프셋 다음 앞에 바로 가질 B 학사의 뒷면을 구성 할 수있다 \ (1 ... n \)은 A. 취소되지
    • 따라서, 적은 AB \는 (N- \) 합법적이다. AB가 동일한 경우 (\ N- 형)를 \ , 마지막이 B라면, 그럼 B는 전면이 때문에 마지막 하나하는 인 것을 의미한다 (N + 1 \) \가 아닌 오프셋 A.
    • 많은 B가 같은 이유로 얼마나 전면.
  • DP

    • \ (DP [I] [J] \) \ (I \) (A)의 대표 번호 \ (J \) B. 수의 대표 \ (DP의 \)는 합법적 인 프로그램을 나타냅니다.

    • A는 각각이 이전에 전술 한 바와 같이 초기화, \ (1 ... m의 \) B가 합법적 토륨, B가 각각의 앞에있는 \ (1 ... n \) 합법적 번째

    • \ (DP [I] [0] = DP [0] [J] = 1 \)

    • 간주되지 순전히 유도 될 수
      \ [DP를 [I]는 [j는 ] DP = [I-1] [J] + DP [I] [J-1] \]

    • 그러나 불법적 인 상황을 제외 할

      • \ (0 \ 당량 지의 \의 당량의 m의 \) 와 \ (0 \ 당량 IJ \ 당량 n \) 인 상황 법적
      • 참고 \을 (m = \)\ (N- = \)\ (= 0 \) 케이스
  • 아니면 세계에서 가장 호 형제, 대답

  • 코드

    #include <bits/stdc++.h>
    
    #define ll long long
    using namespace std;
    const ll mod = 1e9 + 7;
    const ll N = 1e5 + 10;
    ll dp[2010][2010];
    
    int main() {
        ll n, m;
        while (scanf("%lld%lld", &n, &m) != EOF) {
            ll cnt = (n + m);
            for (int i = 0; i <= cnt; i++)
                for (int j = 0; j <= cnt; j++)
                    dp[i][j] = 0;
            for (ll i = 0; i <= cnt; i++) {
                dp[i][0] = dp[0][i] = 1;
            }
            for (ll i = 1; i <= cnt; i++) {
                for (ll j = 1; j <= cnt; j++) {
                    if (i == j) {
                        if (n)
                            dp[i][j] = (dp[i][j] + dp[i][j - 1]) % mod;
                        if (m)
                            dp[i][j] = (dp[i][j] + dp[i - 1][j]) % mod;
                    } else if (j > i) {
                        if (j - i < m)
                            dp[i][j] = ((dp[i][j] + dp[i - 1][j]) % mod + dp[i][j - 1]) % mod;
                        else if (j - i == m)
                            dp[i][j] = (dp[i][j] + dp[i][j - 1]) % mod;
                    } else if (i > j) {
                        if (i - j < n)
                            dp[i][j] = ((dp[i][j] + dp[i - 1][j]) % mod + dp[i][j - 1]) % mod;
                        if (i - j == n)
                            dp[i][j] = (dp[i][j] + dp[i - 1][j]) % mod;
                    }
                    //cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
                }
            }
            printf("%lld\n", dp[cnt][cnt] % mod);
        }
    
        return 0;
    

추천

출처www.cnblogs.com/smallocean/p/11209720.html