• Gym-100923A-Por Costel and Azerah(DP)


    链接:

    https://vjudge.net/problem/Gym-100923A

    题意:

    Por Costel the Pig has received a royal invitation to the palace of the Egg-Emperor of Programming, Azerah. Azerah had heard of the renowned pig and wanted to see him with his own eyes. Por Costel, having arrived at the palace, tells the Egg-Emperor that he looks "tasty". Azerah feels insulted (even though Por Costel meant it as a compliment) and, infuratied all the way to his yolk, threatens to kill our round friend if he doesn't get the answer to a counting problem that he's been struggling with for a while

    Given an array of numbers, how many non-empty subsequences of this array have the sum of their numbers even ? Calculate this value mod (Azerah won't tell the difference anyway)

    Help Por Costel get out of this mischief!

    思路:

    dp, 把子序列当成子串算了半天..

    代码:

    #include <iostream>
    #include <memory.h>
    #include <string>
    #include <istream>
    #include <sstream>
    #include <vector>
    #include <stack>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <math.h>
    #include <cstdio>
    #include <set>
    #include <iterator>
    #include <cstring>
    using namespace std;
    
    typedef long long LL;
    const int MAXN = 1e6+10;
    const int MOD = 1e9+7;
    
    LL dp[MAXN][2], a[MAXN];
    int n;
    
    int main()
    {
        freopen("azerah.in","r",stdin);
        freopen("azerah.out","w",stdout);
        int t;
        cin >> t;
        while (t--)
        {
            memset(dp, 0, sizeof(dp));
            cin >> n;
            for (int i = 1;i <= n;i++)
                cin >> a[i];
            if (a[1]%2)
                dp[1][1] = 1;
            else
                dp[1][0] = 1;
            for (int i = 2;i <= n;i++)
            {
                if (a[i]%2)
                {
                    dp[i][0] = (dp[i-1][0]+dp[i-1][1])%MOD;
                    dp[i][1] = (dp[i-1][0]+dp[i-1][1]+1)%MOD;
                }
                else
                {
                    dp[i][0] = (dp[i-1][0]*2LL+1)%MOD;
                    dp[i][1] = (dp[i-1][1]*2LL)%MOD;
                }
            }
            cout << dp[n][0] << endl;
        }
    
        return 0;
    }
    
  • 相关阅读:
    P1410 子序列 (动态规划)
    P2085 最小函数值 (堆)
    [ZJOI2007]棋盘制作 (单调栈,动态规划)
    [ZJOI2005]午餐 (贪心,动态规划)
    黑匣子_NOI导刊2010提高 (对顶堆)
    [BZOJ1455] 罗马游戏 (左偏树||并查集)
    P1651 塔 (动态规划)
    两类斯特林数 (组合数学)
    从编程到工程
    失败的过程也是过程
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11369497.html
Copyright © 2020-2023  润新知