hdu6578 2019湖南トーナメントのタイトルDモデューロナイン古典的なDP

ディレクトリ

@

タイトル

ここに画像を挿入説明

ここに画像を挿入説明


最初の質問イタリア選択のための番号{0,1,2,3}の4種類の合計であることは、それぞれが間隔[L、R]はインナー言った、長さNの条件を満足する全てのMの何配列を尋ね正確Xは異なる番号がなければなりません。

2番目の質問の質問は、選択番号10を対象とし、長さNのすべてのMの多くの配列が前記各区間の積[L、R]は9つの数字がの倍数でなければならないという条件を満足する方法を尋ねました。

解決

  • hdu6578
  • \(DP [T] [I ] [J] [K] \) 示す正面記入\(T \)の位置、{ \(0,1,2,3 \) }に現れる最後の図に現れますソート後の位置\(T、I、J、 K(iはGT j個の\ GT kを\ Tの\のGTを)\) 番号スキーム。\(0 \)番号は表示されません表します。
  • 転送の4種類を列挙:
  • 充填\(T-1 \)をデジタル位置:\(DP [T] [I]、[J] [K] \)
  • 充填\(Iは\):デジタル位置\(DP [T] [T-1] [J] [K]を\)
  • 充填\(J \)デジタル位置:\(DP [T] [T-1] [I] [K] \)
  • 充填\(K \)デジタル位置:\(DP [T] [T-1] [I]、[J] \)
  • すべての転送は非常に制限を列挙するために、有効ではない。しかし、違法な転送が配ります
  • 内のすべての端を列挙する\さ(t \)の不正転送、制限点\(DP \)ゼロの値。
  • 時間計算:\(O(N ^ 4)\)領域最適化スクロールのアレイの、複雑:\(O(N ^ 3)\)

  • 2019湖南レースDのタイトルモジュロナイン
  • 生成物は9の倍数であるかどうかに、数字の3種類のみ二3,3及び6は、3表し、0〜9のショーがあり、他方がゼロ3を表します
  • \(DP [T] [I ] [J] \) フロント記入示す\(T \)最後の3で、位置を\(Iは\) 最後から二番目の3 \(J \)番号スキーム。
  • 転送の3種類を列挙:
  • 充填\(あるいは0.9 \):\ (DP [T] [T] [T] \)
  • 充填\(あるいは6 \ 3):\ (DP [T] [T] [I] \)
  • 他の図には記入:\(DP [T] [I]、[J] \)
  • すべての転送は非常に制限を列挙するために、有効ではない。しかし、違法な転送が配ります
  • 内のすべての端を列挙する\さ(t \)の不正転送、制限点\(DP \)ゼロの値。
  • 時間計算:\(O(N ^ 3)\)複雑さ、領域最適化スクロールの配列:\(O(^ N-2)\)

まったく同じ二つの質問を考えて、それは古典的なDPです。

AC_Code

hdu6578
const int mod = 998244353;
const int MXN = 1e5 + 7;
const int MXE = 2e5 + 7;

int n, m, c;
vector<pii> mp[MXN];
LL dp[2][101][101][101];
void get_dp() {
    dp[c][0][0][0] = 1;
    for(int t = 1; t <= n; ++t) {
        c ^= 1;
        for(int i = 0; i <= t; ++i) for(int j = 0; j <= i; ++j) for(int k = 0; k <= j; ++k) dp[c][i][j][k] = 0;
        for(int i = 0; i < t; ++i) for(int j = 0; j <= i; ++j) for(int k = 0; k <= j; ++k) {
            if((i != j && j != k) || k == 0) {
                dp[c][i][j][k] = (dp[c][i][j][k] + dp[c ^ 1][i][j][k]) % mod;
                dp[c][t - 1][j][k] = (dp[c][t - 1][j][k] + dp[c ^ 1][i][j][k]) % mod;
                dp[c][t - 1][i][j] = (dp[c][t - 1][i][j] + dp[c ^ 1][i][j][k]) % mod;
                dp[c][t - 1][i][k] = (dp[c][t - 1][i][k] + dp[c ^ 1][i][j][k]) % mod;
            }
        }
        for(int h = 0; h < (int)mp[t].size(); ++h) {
            int l = mp[t][h].fi, x = mp[t][h].se;
            for(int i = 0; i < t; ++i) for(int j = 0; j <= i; ++j) for(int k = 0; k <= j; ++k) {
                int cnt = 1;
                if(i >= l) ++ cnt;
                if(j >= l) ++ cnt;
                if(k >= l) ++ cnt;
                if(cnt != x) dp[c][i][j][k] = 0;
            }
        }
    }
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("/home/cwolf9/CLionProjects/ccc/in.txt", "r", stdin);
    //freopen("/home/cwolf9/CLionProjects/ccc/out.txt", "w", stdout);
#endif
    int tim = read();
    while(tim --) {
        n = read(), m = read();
        for(int i = 1, a, b, c; i <= m; ++i) {
            a = read(), b = read(), c = read();
            mp[b].eb(mk(a, c));
        }
        get_dp();
        LL ans = 0;
        for(int i = 0; i < n; ++i)
            for(int j = 0; j <= i; ++j)
                for(int k = 0; k <= j; ++k) if((i != j && j != k) || k == 0) ans = (ans + dp[c][i][j][k]) % mod;
        printf("%lld\n", (ans+mod)%mod);
    }
#ifndef ONLINE_JUDGE
    cout << "time cost:" << clock() << "ms" << endl;
#endif
    return 0;
}
2019省赛D
const int mod = 1e9 + 7;
const int MXN = 1e5 + 7;
const int MXE = 2e5 + 7;

int n, m, c;
int mp[MXN];
LL dp[2][101][101];
void get_dp() {
    clr(dp, 0);
    dp[c][0][0] = 1;
    for(int t = 1; t <= n; ++t) {
        c ^= 1;
        for(int i = 0; i <= t; ++i) for(int j = 0; j <= i; ++j) dp[c][i][j] = 0;
        for(int i = 0; i <= t; ++i) {
            for(int j = 0; j <= i; ++j) {
                dp[c][i][j] = (dp[c][i][j] + dp[c^1][i][j] * 6) % mod;
                dp[c][t][i] = (dp[c][t][i] + dp[c^1][i][j] * 2) % mod;
                dp[c][t][t] = (dp[c][t][t] + dp[c^1][i][j] * 2) % mod;
            }
        }
        if(mp[t] == -1) continue;
        for(int i = 0; i <= t; ++i) {
            for(int j = 0; j <= i; ++j) {
                if(i < mp[t] || j < mp[t]) dp[c][i][j] = 0;
            }
        }
    }
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("/home/cwolf9/CLionProjects/ccc/in.txt", "r", stdin);
    //freopen("/home/cwolf9/CLionProjects/ccc/out.txt", "w", stdout);
#endif
    int tim = 1;
    while(~scanf("%d%d", &n, &m)) {
        for(int i = 1; i <= n; ++i) mp[i] = - 1;
        for(int i = 1, a, b; i <= m; ++i) {
            a = read(), b = read();
            mp[b] = big(mp[b], a);
        }
        get_dp();
        LL ans = 0;
        for(int i = 0; i <= n; ++i) for(int j = 0; j <= i; ++j) ans = (ans + dp[c][i][j]) % mod;
        printf("%lld\n", (ans + mod) % mod);
    }
#ifndef ONLINE_JUDGE
    cout << "time cost:" << clock() << "ms" << endl;
#endif
    return 0;
}

おすすめ

転載: www.cnblogs.com/Cwolf9/p/11628463.html
おすすめ