传送门

DP

十分显然的DP,但是不好写

设 f[ i ] 表示以第 i 个数作结尾时的方案数,原序列为 a

如果不考虑相同的序列:

  那么转移就是 Σ f[ j ] (0< j < i && a [ j ] < a [ i ])

  复杂度为 O(n^2)

  考虑优化:

    先去重 ,得到数组 b

    每次把f [ i ] 加到树状数组里 a [ i ]的值 在 b 中的位置 的位置

    那么 f [ i ] 就等于 query(a [ i ] 的值在 b 中的位置-1) (query为树状数组的询问操作)

    (上两行很重要,自己在脑子里想象一下,一定要理解原因)

然后考虑去掉相同的序列

很简单

只要每次更新完 f [ i ] 时把 f [ i ] 减去前面 a 中所有值为 a[ i ] 的位置(设为 j)

的 f[ j ]的和(还是要在脑子里想象一下...或者看代码来理解...

最后注意要减去长度为 1 的方案数以及一些细节

代码其实不长

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int N=1e5+7;
const int mo=1e9+7;
int n,a[N],f[N],b[N],t[N],las[N],m,ans;
//t是树状数组的数组,las[i]是前面a中所有值为a[i]的位置(设为j)的f[j]的和
inline int query(int x)
{int res=0;while(x){res=(res+t[x])%mo;x-=x&-x;}return res;
}
inline void add(int x,int v)
{while(x<=m){t[x]=(t[x]+v)%mo;x+=x&-x;}
}
int main()
{cin>>n;for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];sort(b+1,b+n+1); m=unique(b+1,b+n+1)-b-1;//去重for(int i=1;i<=n;i++){int k=lower_bound(b+1,b+m+1,a[i])-b;//找到a[i]在b中的位置
f[i]=(f[i]+query(k-1)+1)%mo;f[i]-=las[k];if(f[i]<0) f[i]+=mo;ans=(ans+f[i])%mo; add(k,f[i]);las[k]=(las[k]+f[i])%mo;}ans-=m; if(ans<0) ans+=mo;//减去长度为1的方案数cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/LLTYYC/p/9651547.html

P3970 [TJOI2014]上升子序列相关推荐

  1. 每周记录(4月底停更了qvq)

    1月6日 旋转卡壳 闵可夫斯基和 1月13日 期末复习 1月20日 网络流前4道题 一场失败的期末考试 写寒假作业 bzoj [HNOI2008]明明的烦恼(90分) prufer序列 正睿 画画图 ...

  2. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  3. JZOJ 3742. 【TJOI2014】上升子序列

    Description Input Output Sample Input 4 1 2 3 3 Sample Output 4 Data Constraint 对于30%的数据,N<=5000 ...

  4. LeetCode简单题之最长和谐子序列

    题目 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 . 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度. 数组的子序列是一个由数组派生出来的 ...

  5. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  6. 最长连续子序列nlogn算法

    最长上升子序列(LIS)长度的O(nlogn)算法 标签: 算法search优化存储 2012-04-18 19:38 14031人阅读 评论(5) 收藏 举报  分类: 资料学习(15)  解题报告 ...

  7. 经典dp最长递增子序列

    经典dp最大递增子序列,  看了好长时间,看了好多版本.最终因为这个看懂,也觉得这个是最全面的吧,我感觉我好菜啊. http://wenku.baidu.com/view/bed07b15552707 ...

  8. leetcode-300 最长上升子序列

    题目描述: 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度 ...

  9. leetcode-152 乘积最大子序列

    题目描述: 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6 ...

  10. 无序数组及其子序列的相关问题研究

    算法中以数组为研究对象的问题是非常常见的. 除了排序大家经常会遇到之外, 数组的子序列问题也是其中的一大分类. 今天我就对自己经常遇到的无序数组的子序列相关问题在这里总结一下. 前置条件: 给定无序数 ...

最新文章

  1. 使用objectdatasource结合数据绑定控件进行简单三层架构的开发
  2. 2019\Province_C_C++_B\试题F-特别数的和
  3. rss聚合模式案例_RSS的完整形式是什么?
  4. AutoCAD_acadiso.dwt卡死
  5. android中实现GPS定位功能,Android中实现GPS定位的简单例子
  6. Mean Shift具体介绍
  7. 转载:word排版之长英文单词自动换行
  8. WPF/Silverlight 控件的几幅继承关系图
  9. Computing Platform------系统平台及其系列
  10. 双系统Ubuntu 无 启用wifi选项
  11. 粉笔画粉笔字体样式_20多种很棒的粉笔字体可供下载
  12. Insyde uefi 隐藏设置_Android/iOS QQ 8.1.5测试版同时发布:私密会话可以隐藏
  13. html带有进度条的登陆,带进度条上传
  14. 企业支付宝转账到银行卡开发导引
  15. PC端如何使用ITunes无线连接ios手机
  16. VLAN 、PVLAN
  17. 计算机开关电源基本原理,开关电源基本原理与设计介绍——第一讲
  18. A3Mall开源商城系统
  19. 为什么随机数要用种子,对种子的理解
  20. 一款开源 OA 办公自动化系统

热门文章

  1. 关于计算机的英语笑话,听笑话学英语:If Life Were Like A Computer假如生活是一台电脑...
  2. oracle中如何测试,Oracle数据库中如何正确的查看sql
  3. QQ帐户的申请与登陆 (25 分)(map映射)
  4. 文本数据增强(data augmentation)textattack使用
  5. 电能表软件测试用例,一种用于电能表软件自动测试的方法专利_专利查询 - 天眼查...
  6. opencv ret, binary = cv2.threshold(src, 180, 255, )二值化的类型
  7. tensor.detach() 和 tensor.data 的区别
  8. caffe的googlenet模型使用
  9. yolov4-tiny目标检测模型实战——学生姿势行为检测
  10. 使用Python从头开始实现基线机器学习算法