• 51nod 子序列的个数(动态规划)


    子序列的个数

    给定一个正整数序列,序列中元素的个数和元素值大小都不超过105, 求其所有子序列的个数。注意相同的只算一次:例如 {1,2,1}有子序列{1} {2} {1,2} {2,1}和{1,2,1}。最后结果对10^9 + 7取余数。

    输入

    第1行:一个数N,表示序列的长度(1 <= N <= 100000)
    第2 - N + 1行:序列中的元素(1 <= a[i] <= 100000)
    输出
    输出a的不同子序列的数量Mod 10^9 + 7。
    输入示例
    4
    1
    2
    3
    2
    输出示例
    13
    请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案。
    不同语言如何处理输入输出,请查看下面的语言说明。
    【分析】

    dp[i] = dp[i – 1] * 2  如果a[i]不在之前出现
    dp[i] = dp[i – 1] * 2 – dp[j – 1],如果a[i]最近在j的位置出现过。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define mod 1000000007
    typedef long long ll;
    using namespace std;
    ll dp[1000006],have[1000006],a[1000006];
    int n,cnt,m,h;
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        dp[0]=1;
        memset(have,0,sizeof(have));
        for(int i=1;i<=n;i++)
        {
            if(have[a[i]]==0){dp[i]=(dp[i-1]*2)%mod;}
            else {dp[i]=(dp[i-1]*2-dp[have[a[i]]-1]+mod)%mod;}
            have[a[i]]=i;
    
        }
        cout<<(dp[n]-1)%mod<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    G D 3 2 预 处 理 符 号 配 置 中 定 义
    指针接收函数
    SMT(SF)
    电流高端采样问题
    简单分析一个采集交流电压平均值的电路
    i--和--i的区别
    结构体共用体的使用
    .net Filter 和 代理模式杂谈
    Spring boot 日志 Logback
    spring boot 使用 mongodb
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5709161.html
Copyright © 2020-2023  润新知