【题解】子序列个数 [51nod1202] [FZU2129]

传送门:子序列个数 \([51nod1202]\) \([FZU2129]\)

【题目描述】

对于给出长度为 \(n\) 的一个序列 \(a\),求出不同的非空子序列个数。答案对 \(10^9+7\) 取模。

【样例】

样例输入:
4
1
2
3
2 样例输出:
13

【数据范围】

\(100\%\) \(1 \leqslant N,a[i] \leqslant 10^5\)


【分析】

先考虑没有相同整数的情况,每个元素有选或不选两种情况,一共 \(n\) 个元素,又不能有空集,答案为 \(2^n-1\)。

如果要写递推方程的话就是 \(dp[i]=dp[i-1]*2+1\),其中 \(dp[i]\) 表示选择原序列中前 \(i\) 个元素所能构成的不同子序列数量,\(dp\) 方程含义为:在长度为 \(i-1\) 的序列中是否加入一个 \(a[i]\) \((\) \(2*dp[i-1]\) 种 \()\) 以及只选 \(a[i]\) 的情况 \((\) \(1\) 种 \()\) 。

假设就按照这个方程推下去,如果前面某一位 \(j\) 上的数与 \(a[i]\) 相同,会对 \(dp[i]\) 造成什么影响呢?

首先,只选 \(a[i]\) 这一个数的情况已经在前面统计过了。

然后,\(j\) 前面的所有方案都不能转移到 \(dp[i]\) 上面来,因为它们已经转移到 \(dp[j]\) 上。

这里的 \(“\) 所有方案 \(”\) 其实就是 \(dp[j-1]\),且 \(j\) 必须为最接近 \(i\) 的那一个位置,否则就不能代表所有被算重复的情况

用 \(w[a[i]]\) 表示前面等于 \(a[i]\) 的且位置最靠近 \(i\) 的数的位置,若不存在则 \(w[a[i]]=0\),\(dp\) 方程为:

\(dp[i]=\begin{cases} dp[i-1]*2+1 & w[a[i]]=0\\dp[i-1]*2+1-dp[w[a[i]]-1]-1 & w[a[i]]!=0 \end{cases}\)

时间复杂度为:\(O(n)\) 。


【Code】

#include<algorithm>
#include<cstring>
#include<cstdio>
#define Re register int
const int N=1e6+3,P=1e9+7;
int n,ans,a[N],W[N],dp[N];
inline void in(Re &x){
int f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(dp,0,sizeof(dp));
memset(W,0,sizeof(W));
for(Re i=1;i<=n;++i){
in(a[i]);
dp[i]=((dp[i-1]<<1)%P+1)%P;
if(W[a[i]])((dp[i]-=(dp[W[a[i]]-1]+1)%P)+=P)%=P;
W[a[i]]=i;
}
printf("%d\n",dp[n]%P);
}
}

【题解】子序列个数 [51nod1202] [FZU2129]的更多相关文章

  1. 子序列个数(fzu2129)

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

  2. 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了 ...

  3. 「 LuoguT37042」 求子序列个数

    Description 给定序列 A, 求出 A 中本质不同的子序列 (包含空的子序列) 个数模 10^9+ 7 的结果. 一个序列 B 是 A 的子序列需要满足 A 删掉某些元素后能够得到 B. 两 ...

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

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

  5. fzuoj Problem 2129 子序列个数

    http://acm.fzu.edu.cn/problem.php?pid=2129 Problem 2129 子序列个数 Accept: 162    Submit: 491Time Limit: ...

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

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

  7. 51nod 1202 子序列个数

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

  8. 1202 子序列个数(DP)

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

  9. 51nod 1202 不同子序列个数 [计数DP]

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

随机推荐

  1. CTF-代码审计(1)——parse_str()变量覆盖

    题目连接:http://222.18.158.226:7000/iscc.php 考点:parse_str()变量覆盖 代码: PHP知识点: 1.parse_url() 参照网址:https://w ...

  2. shell公共函数functions

    checkpid:检查是否已存在pid,如果有一个存在,返回0(通过查看/proc目录) daemon:启动服务 killproc:杀死某个进程 pidfileofproc:寻找某个进程的pid pi ...

  3. android自定义圆角实线边框,圆角虚线边框,直实线,虚实线,半圆角边框

    先上图 在现实项目开发中,单纯的Button,EditText等控件远远不能满足我们项目的UI设计需求,这时候,我们就需要自己动手丰衣足食啦.接下来先给大家介绍一些属性,备注写的都非常清楚啦,我就不啰 ...

  4. 如何修改被readonly修饰的属性

    结论: 1.用KVC改变只读属性的值: 2.若禁止KVC方式修改只读属性的值,可在对应类重写类方法 // 该方法默认返回YES. 即在不存在满足条件的存取方法时,允许直接访问属性对应的实例变量+ (B ...

  5. django2外键,F表达式,Q表达式

    一对多 环境 两个类:书的类别和文章,一片文章只能有一个作者,一个作者可以有多个文章,这之间组成了一对多的关系 class Category(models.Model): category = mod ...

  6. Linux shell变量详解

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个 ...

  7. nfs—文件转换器

    前端时间,在做一次设备升级时对nfs有了新的认识. nfs一般认为是文件共享服务器,但在实际的工作环境中,业务服务器有诸多限制,需要有加密隔离措施等等,版本升级和功能调试不同于平时的实验环境. 特别好 ...

  8. destoon搜索伪静态失败解决办法

    今天给一个朋友调试DT6.0内核的站点,搜索中文出现http 403 forbidden,找了半天,很纳闷,最后一个一个查看源代码总算找到,在此分享给大家! 解决的方法: 1.找到include/sa ...

  9. windows 运行库与dll文件

    Windows 10包含版本 win10家庭版win10专业版win10教育版win 10企业版 Windows 7包含6个版本分别为Windows 7 Starter(初级版)Windows 7 H ...

  10. 洛谷 P1167 刷题

    洛谷 P1167 刷题 洛谷传送门 题目描述 noip临近了,小A却发现他已经不会写题了.好在现在离竞赛还有一段时间,小A决定从现在开始夜以继日地刷题.也就是说小A废寝忘食,一天二十四小时地刷题. 今 ...