• T^T online judge 2952


    Problem Description

    给一个01字符串求,这个字符串包含多少种不同的01字序列。

    比如

    101

    有1,10,0,101,11,01,这6种不同的01子序列

    Input

    每个文件仅包含一个数据

    第一行是一个整数n代表字符的长度

    接下来一行是长度为n的01字符串

    1<n<=1e6

    Output

    将结果对1e9+7取模后输出

    SampleInput
     
    SampleOutput
     
     
    附上题目网址: http://www.fjutacm.com/Problem.jsp?pid=2952
     
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define mem(x) memset(x, 0, sizeof(x))
    using namespace std;
    typedef long long LL;
    const int MOD = 1e9 + 7;
    /**
     8
     10000001
     
     ORZ 我旺神
     偷偷的看眼旺神的题解
     已知01字符串要么以1结尾或者以0结尾
     那么可知当前长度下以0结尾或者以1结尾
     都是由前面的以1结尾或者以0结尾来转移
     dp[i][0 or 1]
     dp[0][0] = dp[0][1] = 0;
     if(s[i] == 1)
     {
        dp[i][1] = dp[i - 1][0] + dp[i - 1][1] + 1;
        dp[i][0] = dp[i - 1][0];
     }
     else
     {
        dp[i][0] = dp[i - 1][0] + dp[i - 1][1] + 1;
        dp[i][1] = dp[i - 1][1];
     }
     **/
    const int MAXN = 1e6 + 5;
    char str[MAXN];
    int n;
    LL dp[MAXN][2];
    int main()
    {
        scanf("%d", &n);
        mem(str), mem(dp);
        scanf("%s", str);
        for(int i = 0; i < n; i ++)
        {
            if(str[i] == '1')
            {
                dp[i + 1][1] = (dp[i][0] % MOD + dp[i][1] % MOD + 1) % MOD;
                dp[i + 1][0] = dp[i][0] % MOD;
            }
            else if(str[i] == '0')
            {
                dp[i + 1][0] = (dp[i][0] % MOD+ dp[i][1] % MOD + 1) % MOD;
                dp[i + 1][1] = dp[i][1] % MOD;
            }
        }
        printf("%lld
    ", (dp[n][0] % MOD + dp[n][1] % MOD) % MOD);
        return 0;
    }
  • 相关阅读:
    bzoj2161 布娃娃
    bzoj2161 布娃娃
    Tyvj1054
    Tyvj1054
    Tyvj1053
    Tyvj1053
    hdu3265 Poster(扫描线)
    hdu3265 Poster(扫描线)
    hdu3265(好题翻译)
    hdu3265(好题翻译)
  • 原文地址:https://www.cnblogs.com/qq136155330/p/10692669.html
Copyright © 2020-2023  润新知