ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [c++] dp 캐싱할때 절대 나오지 않는걸로 초기화해야함
    실수모음 2022. 12. 23. 14:44
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <bits/stdc++.h>
    #define endl "\n" // don't use when you cover interactive problem
    #define all(v) (v).begin(), (v).end()
     
    using namespace std;
    typedef long long ll;
    typedef pair<intint> pi;
    typedef pair<ll, ll> pl;
     
    ll m;
    ll rm[4001];
    ll c[4001][2001];
    ll mod = 100007;
     
    ll give_c(ll n, ll m)
    {
        m = min(m, n-m);
        if(c[n][m] != -1return c[n][m]; // 정리 DP 캐싱할때 나올 수 없는값으로 비교
        else{
            ll pre = give_c(n-1, m)%mod + give_c(n-1, m-1)%mod;
            return c[n][m] = pre%mod;
        }
    }
     
    ll give_rm(ll n)
    {
        if(rm[n] != -1return rm[n]; // dp값이 0이 될 수 있을때 이렇게 하면 안됨
        else {
            ll pre = give_rm(n - 1);
            pre += give_c(2*n+3, n);
            pre %= mod;
            pre += give_c(2*n+3, n);
            pre %= mod;
            return rm[m] = pre;
        }
    }
     
    ll solve(ll m)
    {
        ll ans = m*3%mod;
        for(ll i = 0; i < m-3; i++){
            ll tmp = (give_c(2*i+5, i+2- give_rm(i) + mod * mod)%mod; // mod 연산에서는 음수나올 수 있음
            ans += m*tmp%mod;
        }
        return ans%mod;
    }
     
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
     
        #ifndef ONLINE_JUDGE
            freopen("../input.txt""r", stdin);
            freopen("../output.txt""w", stdout);
        #endif
     
        cin >> m;
        fill_n(rm, 4001-1);
        fill_n(c[0], 4001*2001-1);
        rm[0= 2;
        for(int i = 1; i < 4001; i++){
            c[i][0= 1;
            c[i][1= i;
        }
     
        cout << solve(m) << endl;
     
        return 0;

    댓글

Designed by Tistory.