http://acm.fzu.edu.cn/problem.php?pid=2129

Problem 2129 子序列个数

Accept: 162    Submit: 491
Time Limit: 2000 mSec    Memory Limit : 32768 KB

 Problem Description

子序列的定义:对于一个序列a=a[1],a[2],......a[n]。则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.....<pm<=n。

例如4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。

对于给出序列a,请输出不同的子序列的个数。(由于答案比较大,请将答案mod 1000000007)

 Input

输入包含多组数据。每组数据第一行为一个整数n(1<=n<=1,000,000),表示序列元素的个数。

第二行包含n个整数a[i] (0<=a[i]<=1,000,000)表示序列中每个元素。

 Output

输出一个整数占一行,为所求的不同子序列的个数。由于答案比较大,请将答案mod 1000000007。

 Sample Input

4
1 2 3 2

 Sample Output

13

 Hint

其中40%数据点1<=n<=1000。

 Source

福州大学第十届程序设计竞赛

 
分析:

给定一个字符串,求出该字符串有多少个不同的子序列

定义dp[k]为前k个字符中子序列的个数

那么dp[k]来自于两种状态,

dp[k]=2*dp[k-1]+1;如果a[k]与前k-1个字符都不相同

dp[k]=2*dp[k-1]-dp[t-1],如果a[k]与前k-1个字符有相同的,t是与之相同的最近的一个下标。

AC代码:

 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#define N 1000050
#define mod 1000000007
using namespace std;
int a[N],b[N];
long long dp[N];
int main()
{
int n,i,j;
while((scanf("%d",&n))!=EOF)
{
for(i=;i<=n;i++)
scanf("%d",&a[i]);
memset(b,,sizeof(b));
memset(dp,,sizeof(dp));
for(i=;i<=n;i++)
{
if(b[a[i]]==)
dp[i]=(dp[i-]*+)%mod;
else
dp[i]=(dp[i-]*-dp[b[a[i]]-]+mod)%mod;
b[a[i]]=i;
}
printf("%lld\n",dp[n]%mod);
}
return ; }

fzuoj Problem 2129 子序列个数的更多相关文章

  1. FZU Problem 2129 子序列个数

    看了 dp 方程之后应该是妙懂 每次 加入一个数,×2  然后剪掉重复的: 重复的个数 维前面那个数,,,,, #include<iostream> #include<stdio.h ...

  2. FZU 2129 子序列个数 (递推dp)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2129 dp[i]表示前i个数的子序列个数 当a[i]在i以前出现过,dp[i] = dp[i - 1]*2 - ...

  3. FZU 2129 子序列个数

     Problem Description 子序列的定义:对于一个序列a=a[1],a[2],......a[n].则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1& ...

  4. FZU 2129 子序列个数 (动态规划)

    题意:子序列的定义:对于一个序列a=a[1],a[2],......a[n].则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.. ...

  5. FZU 2129 子序列个数(DP)题解

    题意:求子序列种数 思路:dp[i]代表到i的所有种数,把当前i放到末尾,那么转移方程dp[i] = dp[i - 1] + dp[i -1],但是可能存在重复,比如1 2 3 2,在第2位置的时候出 ...

  6. 子序列个数(fzu2129)

    子序列个数 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  7. hdu4632 Palindrome subsequence 回文子序列个数 区间dp

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

  8. 51nod1202 子序列个数

    看到a[i]<=100000觉得应该从这个方面搞.如果a[x]没出现过,f[x]=f[x-1]*2;否则f[x]=f[x-1]*2-f[pos[a[x]]-1];ans=f[n]-1,然后WA了 ...

  9. 51nod 1202 子序列个数

    1202 子序列个数  题目来源: 福州大学 OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 子序列的定义:对于一个序列a=a[1],a[2] ...

随机推荐

  1. ViewPager打造轮播图(Banner)\引导页(Guide)

    今年7月时,在Github发布了一个开源的Banner库,虽然Star不多,但还是有少部分人使用. Banner效果:  昨天,有使用此库的同学提出需求,想在引导页的时候用这个库并且最后一页有进入按钮 ...

  2. mysql解压版安装

    1.下载MySQL解压版(32位) http://dev.mysql.com/downloads/mysql/

  3. requirejs(一)

    RequireJs已经流行很久了,我们在项目中也打算使用它.它提供了以下功能: 声明不同js文件之间的依赖 可以按需.并行.延时载入js库 可以让我们的代码以模块化的方式组织 初看起来并不复杂. 在h ...

  4. PHP-Redis扩展使用手册(四)

    /* 添加一个或者多个value到无顺序集合总,如果value已经成set中,则返回false * @param key set名称 * @param value * ... * @return in ...

  5. JSHint Options 翻译

    Enforcing options When set to true, these options will make JSHint produce more warnings about your ...

  6. js 无缝滚动效果学习

    <!DOCTYPE html> <html> <head> <title>无缝滚动测试</title> <meta http-equi ...

  7. Flask 教程

    官方文档 推荐教程 环境 pip install virtualenv cd proj_fold virtualenv venv . venv/bin/activate for *unix or ve ...

  8. C# CodeFirst(EF框架)代码优先创建数据库

    namespace WebEF.Model{ public class ModelContext:DbContext //继承DBcontext 来自EF框架 { public ModelContex ...

  9. 谢欣伦 - OpenDev原创教程 - 串口类CxSerial

    这是一个精练的串口类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. 串口类CxSerial的使用如下(以某个叫做CSomeClass ...

  10. pict(Pairwise Independent Combinatorial Testing)工具使用

    PICT工具就是在微软公司内部使用的一款成对组合的命令行生成工具,现在已经对外提供,可以在互联网上下载到. 要把输入类型和其对应的参数输入到一个CSV格式(CSV: 以逗号分割的纯文本文件,不带有任何 ...