#597(本部2)C.コンスタンツェのマシンラウンドCodeforces

リンク:

https://codeforces.com/contest/1245/problem/C

質問の意味:

コンスタンツェは彼女の村で賢い女の子ですが、彼女は悪い視力を持っています。

ある日、彼女は信じられないほどのマシンを発明することができました!あなたが文字を発音すると、マシンは一枚の紙の上にそれらを刻むます。あなたがそのために「C」、「O」、「D」、と「e」を発音た場合、その後、マシンは紙の上に「コード」を刻むます。このマシンのおかげで、彼女はついに彼女のメガネを使用せずにメッセージを書き込むことができます。

しかし、彼女のダムの友人アッコは彼女にいたずらをすることにしました。あなたは「W」発音ならば、それは代わりに「W」の「UU」刻むだろう、とあなたは「M」の発音ならば、それは代わりに「M」は「NN」刻むなるようアッコは、マシンと手を加え!コンスタンツェが悪い視力を持っていたので、彼女はアッコが何をしたかを実現することができませんでした。

手紙の残りの部分は前と同じように動作:あなたは「W」と「M」以外の任意の文字を発音すると、マシンは単に紙の上にそれを刻むます。

次の日、私は私のメールボックスに手紙を受け取りました。私はそれだけでいくつかのアッコからちんぷんかんぷん、またはコンスタンツェのどちらかが彼女のマシンを使用してそれを作ったと思うので、それを理解することはできません。しかし、私はアッコが何をしたか知っているので、私はちょうどコンスタンツェのマシンは、私が得たメッセージになっているだろう、すべての可能な文字列を下に一覧表示することができ、何が理にかなっているかどうかを確認します。

しかし、私は必要になりますどのくらいの紙を知る必要があり、私は助けのためにあなたを求めている理由です。私にコンスタンツェのマシンは、私が得たメッセージになったでしょう文字列の数を教えてください。

この数は非常に大きくなることができますので、109 + 7で割ったときしかし、代わりにその残りを教えてください。

コンスタンツェのマシンは、私が得たメッセージになったでしょう何の文字列が存在しない場合は、0を印刷します。

アイデア:

DPは、Dpのための2つの連続する遷移値を検討[I] = Dpの[I -1] + Dpの[I-2]、 又はDpは[I] = Dpの[I -1]。
場合mは0であり、Wが生じます。

コード:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MOD = 1e9+7;
const int MAXN = 1e5+10;
 
string s;
LL Dp[MAXN];
 
int main()
{
    ios::sync_with_stdio(false);
    cin >> s;
    int len = s.length();
    Dp[0] = Dp[1] = 1;
    for (int i = 1;i < len;i++)
    {
        if (s[i] == s[i-1] && (s[i] == 'u' || s[i] == 'n'))
            Dp[i+1] = (Dp[i]+Dp[i-1])%MOD;
        else
            Dp[i+1] = Dp[i];
    }
    for (int i = 0;i < len;i++)
    {
        if (s[i] == 'w' || s[i] == 'm')
        {
            cout << 0 << endl;
            return 0;
        }
    }
    cout << Dp[len]%MOD << endl;
 
    return 0;
}

おすすめ

転載: www.cnblogs.com/YDDDD/p/11797728.html