dp上升子序列方案数

这篇博客探讨了如何计算上升子序列的个数,重点介绍了动态规划和树状数组在解决此类问题中的应用。博客首先解释了dp[i]的含义,并详细阐述了处理重复元素的方法。博主通过分析P3970和HDU-3030两道题目,说明了在序列中找到严格递增子序列的策略,并给出了相应数据范围和输入输出格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二更,蓝桥杯国赛来了这题,但是没做出来,重新理解了一遍
dpi:以第i小的字符结尾的上升子序列的种类数,dp从字符串头到尾遍历,
字符串中有若干个字符c,如 . . . c 1 . . . c 2 ...c_1...c_2 ...c1...c2,靠后面出现的字符 c 2 c_2 c2必定包含了前面同一字符 c 1 c_1 c1的所有可能, c 2 c_2 c2也有自己独特的可能情况,如 c 1 c_1 c1 c 2 c_2 c2间出现了比c小的其他字符等等,所以,最后答案就只用字符c最后一次出现的位置,该字符的贡献,所以加一个遇到的c字符的贡献,记录下来,之后再次出现时减去上一次的贡献再加上这次的贡献,这样就只记录了c字符最后一个的值,不过中间的值可以被其他字符使用到,所以要记录。

P3970 [TJOI2014]上升子序列
题目描述

给定一个只包含整数的序列(序列元素的绝对值大小不超过10^9),你需要计算上升子序列的个数,满足如下条件的称之为一个上升子序列:

  1. 是原序列的一个子序列

  2. 长度至少为2

  3. 所有元素都严格递增

如果两个上升子序列相同,那么只需要计算一次。例如:序列{1,2,3,3}有4个上升子序列,分别为{1,2}{1,3},{1,2,3},{2,3}

输入格式

输入的第一行是一个整数n,表示序列长度。接下来一行是n个整数,表示序列。

输出格式

输出仅包含一行,即原序列有多少个上升子序列。由于答案可能非常大,你只需要输出答案模10^9+7的余数。

输入
4
1 2 3 3
输出
4
数据范围

对于 30% 的数据,N ≤ 5000
对于 100% 的数据,N ≤ 10^5

如果不去重的话,dp[i]代表以第i小为结尾的上升子序列数量, d p [ i ] = 1 + ∑ j = 1 i − 1 d p [ j ] dp[i]=1+\sum_{j=1}^{i-1}dp[j] dp[i]=1+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值