[HDU 4055]数文字列

DP古典的な良い質問。

質問の説明の意味:

「I」が「D」の文字列を与えられた「?」組成物は、長さnの、1 + 1-nの所定の条件を定義する文字列の任意の数で配置が満たされ、IはI + 1をi番目のビットを表します。ビットが上昇している、D表現が低下していますか?それは表現、およびMOD%値1E9 + 7への答え与え合うように配置されているどのように多くの条件を求められることができます

アイデアの分析:

DP [I] [j]は、前の列の条件を満たすjのi番目の終わりを示し、I設け配置

  1. 若 'I' は[I] == sは、DP [I] [J] = DP [I - 1] [J - 1] + DP [I - 1] [J - 2] + ... + DP [I - 1] [1]

  2. 若S [I] == 'D'、DPは、[I]は[j]はDPを= [I - 1]〜[J] + DP [I]、[J + 1] + ... + DP [I - 1] [私 ]

次のステップは減少している場合は、Jを作りたいので、現在位置は、J早いがあった場合、それ以前のすべての数以上J + 1になります、私たちは、新しい配列を構築することができます。そのようなものとして

{1、3、5、2、4}、3は、第六の場所に挿入されるように> + 1 = 3であるので、新たな構成を構築するため、{1、4、6、2、5、3} 。そして、その後、接頭コードとの和を処理[i] [j]は、[i] [j]のをDPはありません

コード:

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int mod = 1e9 + 7;
const int N = 1010;

int sum[N][N];
char s[N];

main()
{
    // freopen("in.txt", "r", stdin);
    while (scanf("%s", s) != -1)
    {
        sum[0][1] = 1;
        int n = strlen(s);
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n + 1; j++)
            {
                sum[i][j] = sum[i][j - 1];
                if (s[i - 1] != 'D')
                    sum[i][j] += sum[i - 1][j - 1];
                if (s[i - 1] != 'I')
                    sum[i][j] += (sum[i - 1][i] - sum[i - 1][j - 1] + mod);
                sum[i][j] %= mod;
            }
        std::cout << sum[n][n + 1] << '\n';
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/wyctstf/p/11375444.html