51nod 1202不同子序列个数(dp)

子序列的定义:对于一个序列a=a1 1 ,a2 2 ,......an n 。则非空序列a‘=ap1 p1 ,ap2 p2 ......apm pm 为a的一个子序列,其中1<=p1<p2<.....<pm<=n。

例如4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。对于给出序列a,有些子序列可能是相同的,这里只算做1个,请输出a的不同子序列的数量。由于答案比较大,输出Mod 10^9 + 7的结果即可。

Input第1行:一个数N,表示序列的长度(1 <= N <= 100000)
第2 - N + 1行:序列中的元素(1 <= ai i

<= 100000)Output输出a的不同子序列的数量Mod 10^9 + 7。Sample Input

4
1
2
3
2

Sample Output

13Solution:设以第i位为结尾且一定选的方案数一片题解:https://www.cnblogs.com/acerkoo/p/11621037.html
#include <cstdio>

using namespace std;

const int maxn = 1e5+10;
const int mod = 1e9+7;

int last[maxn];
int dp[maxn], pre[maxn];
int n, a[maxn];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", a+i);

//    思路一:
//    pre[0] = 1;
//    for (int i = 1; i <= n; ++i) {
//        if(last[a[i]] == 0) dp[i] = pre[i-1];
//        else dp[i] = (pre[i-1]-pre[last[a[i]]-1]+mod)%mod;
//        pre[i] = (pre[i-1] + dp[i]) % mod;
//        last[a[i]] = i;
//    }
//    printf("%d\n", (pre[n]-1+mod)%mod);

//  思路二:
    dp[1] = 1, last[a[1]] = 1;
    for (int i = 2; i <= n; ++i) {
        if(last[a[i]] == 0) dp[i] = (dp[i-1]*2%mod+1)%mod;
        else dp[i] = (dp[i-1]*2%mod-dp[last[a[i]]-1]+mod)%mod;
        last[a[i]] = i;
    }

    printf("%d\n", dp[n]);
    return 0;
}

  




原文地址:https://www.cnblogs.com/zhangbuang/p/11624259.html

时间: 2024-08-04 08:16:08

51nod 1202不同子序列个数(dp)的相关文章

51nod 1202 不同子序列个数(计数DP)

1202 子序列个数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 子序列的定义:对于一个序列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,有些子序列可能是相同的,这里只算做1个,请输出a的不同子序列的数量.由于答案比较大,输出Mod 10

51nod 1202不同子序列个数

题意 求本质不同子序列的数量. 传送门 思路 思路一:\(dp[i] = \sum_{j=last[a[i]]}^{i-1} dp[j]\) \(dp[i]\) 表示第 i 位数字作为子序列的最后一位的数量. 当\(a[i]\) 未出现过时: \(dp[i]\) 可从之前所有状态包括空串转移过来,即:\(dp[i] = \sum_{j=0}^{i-1}dp[j]\). 当\(a[i]\) 出现过时:\(dp[i]\) 还是可从之前所有状态转移过来,但是对于\([0,last[a[i]]-1]\)

FZUProblem 2129 子序列个数(dp)

 Problem 2129 子序列个数 Accept: 147    Submit: 432 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,1

51NOD 1202 子序列个数 DP

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202&judgeId=225600 这题看起来挺复杂,但是真正的dp还是挺好理解的.唯独是想不到的,应该把样例模拟一遍. 比如1.2.4.2 考虑第一个,只有"1"这一个子序列 考虑前两个,有:"1", "12", "2" 前三个,有:"1", "12"

51nod 1202 子序列个数

1202 子序列个数  题目来源: 福州大学 OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 子序列的定义:对于一个序列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,有些子序列可能是相同的,这里只算做1

1202 子序列个数

1202 子序列个数 基准时间限制:1 秒 空间限制:131072 KB 子序列的定义:对于一个序列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,有些子序列可能是相同的,这里只算做1个,请输出a的不同子序列的数量.由于答案比较大,输出Mod 10^9 + 7的

51nod 1202 线性dp

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202 1202 子序列个数 题目来源: 福州大学 OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 子序列的定义:对于一个序列a=a[1],a[2],......a[n].则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.....<pm<=n. 例

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

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2129 dp[i]表示前i个数的子序列个数 当a[i]在i以前出现过,dp[i] = dp[i - 1]*2 - dp[pre - 1],pre表示a[i]在i之前的位置 当a[i]在i以前没有出现过,dp[i] = dp[i - 1] *2 + 1 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <a

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

Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/Others)Total Submission(s): 4513    Accepted Submission(s): 1935 Problem Description In mathematics, a subsequence is a sequence that can be derived f