题目:http://acm.hdu.edu.cn/showproblem.php?pid=2227

题意:给定一个长度为n(n <= 100000)的整数序列,求其中的非降子序列的个数。

分析:如果n的值比较小,那么就是一个纯粹的dp题。设dp[i]表示以a[i]为结尾非降子序列的个数,其状态转移方程为:

可以看出,这样做的时间复杂度是,很显然不能这样做。

那么实际上,我们看到会想到逆序数,自然也会想到求逆序数最经典的做法就是树状数组,所以问题可以转化为求逆序数的对数,那么我们可以利用dp的思想递推下去,最终求得答案,可以看出这样做的时间复杂度为

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>using namespace std;
const int N = 100005;
const int MOD = 1000000007;struct node
{int id,val;
};int n;
node a[N];
int aa[N],c[N],t[N];bool cmp(node a,node b)
{return a.val < b.val;
}int Lowbit(int x)
{return x & (-x);
}void Update(int t,int val)
{for(int i=t; i<=n; i+=Lowbit(i)){c[i] += val;c[i] %= MOD;}
}int getSum(int x)
{int ans = 0;for(int i=x; i>0; i-=Lowbit(i)){ans += c[i];ans %= MOD;}return ans;
}int main()
{while(scanf("%d",&n)!=EOF){memset(c,0,sizeof(c));memset(aa,0,sizeof(aa));for(int i=1;i<=n;i++){scanf("%d",&a[i].val);a[i].id = i;}sort(a+1,a+n+1,cmp);aa[a[1].id] = 1;for(int i=2;i<=n;i++){if(a[i].val != a[i-1].val)aa[a[i].id] = i;elseaa[a[i].id] = aa[a[i-1].id];}for(int i=1;i<=n;i++){t[i] = getSum(aa[i]);Update(aa[i],t[i]+1);}printf("%d\n",getSum(n));}return 0;
}

HDU2227(非降子序列的个数)相关推荐

  1. 最长非降子序列(动态规划dp dynamic programming)

    首先要理解一下什么叫做非降子序列 非降子序列,简单来说就是指给出一个数字序列,在不改变整体顺序的情况下摘出几个来组成一个子序列,这个序列满足从小到大的排序顺序. 所以,最长非降子序列,不难理解就是从这 ...

  2. 最长非降子序列 动态规划 java

    1. 案例提出 给定一个由n个正整数组成的序列,从该序列中删除若干个整数,使剩下的整数组成非降子序列,求最长的非降子序列. 例如,由12个正整数组成的序列为: 48,16,45,47,52,46,36 ...

  3. 动态规划 dp02 最长非降子序列问题 c代码

    先看下题目: 给定一个由n个正整数组成的序列,从该序列中删除若干个整数,使剩下的整数组成非降子序列,求 最长的非降子序列. 例如,由12个正整数组成的序列为:48,16,45,47,52,46,36, ...

  4. 动态规划——最长非降子序列

    前言 先分享一篇文章<动态规划:从新手到专家>,作者正是通过这篇文章来学习的.文中对动态规划的设计思想做了非常详细的介绍,并通过简单问题和复杂问题对动态规划的设计流程进行剖析,以下是作者和 ...

  5. 第1关:最长非降子序列(非连续)问题

    方法一:使用栈的方式 // // main.cpp // step1 // // Created by ljpc on 2018/12/8. // Copyright ? 2018年 ljpc. Al ...

  6. hdu5256序列变换(非递减子序列)

    题意(中文直接粘吧) 序列变换 Problem Description     我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个 ...

  7. 【组合数学】非降路径问题 ( 非降路径问题概要说明 | 非降路径问题基本模型 | 非降路径问题拓展模型 1 非原点起点 | 非降路径问题拓展模型 2 有途经点 )

    文章目录 一.非降路径问题 概要说明 二.非降路径问题 基本模型 二.非降路径问题 拓展模型 1 三.非降路径问题 拓展模型 2 组合恒等式参考博客 : [组合数学]二项式定理与组合恒等式 ( 二项式 ...

  8. 求数组非连续子序列的最大和

    题目描述: 1. 一个整数数组L,如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和.这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻.例如, ...

  9. C语言(CED)查找最接近的元素(分治法/二分查找):在一个非降序列中,查找与给定值最接近的元素。(递归实现)

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 一.题目大意 查找最接近的元素(分治法/二分查找):在一 ...

最新文章

  1. 我很高兴地宣布我正在编写第一本官方ABP图书
  2. 【周末狂欢赛7】【NOIP模拟赛】七夕祭,齿轮(dfs),天才黑客
  3. Android 侧滑多层view显示
  4. 【LeetCode笔记】102. 二叉树的层序遍历(Java、队列、DFS)
  5. 一文了解 AI 改变生活的 14 种姿势
  6. LDAP TLS配置
  7. gimp 抠图_GMIC(gimp 快速抠图)V1.5.2.4 免费版
  8. 对数几率回归(逻辑回归)
  9. 海马玩模拟器启动失败,start machine failed! error code = 3和error code=21
  10. 从底特律的覆灭,反思“珠三角”未来
  11. 英语听力 Listen To This 全套下载
  12. 计算机毕业设计JAVA家庭健康预警系统mybatis+源码+调试部署+系统+数据库+lw
  13. Linux磁盘与文件系统管理
  14. 面向接口编程,接口是什么,有什么作用?
  15. linux分区如何4k对齐,Linux如何进行无损修复4K对齐?
  16. cad计算机绘图入门,CAD小白如何从零基础到入门?学会画完这些图纸才勉强过关...
  17. 海天蚝油《挑战不可能》夏伯渝获年度挑战大奖
  18. 谷歌云实例如何使用 SSH 密钥登录
  19. 创建更好的移动Demo:工具篇
  20. 鉴于vnn 不能注册,推荐hamachi

热门文章

  1. IDEA 集成Lombok 插件-配置注解处理器
  2. base64核心原理
  3. Oracle 存储过程入门
  4. Oracle 语言分类 数据类型 数据类型转换 常用函数 集合操作 子查询
  5. Dubbox-REST风格
  6. matlabk大于等于0如何表示_【底层原理】浮点数在计算机中是如何表示
  7. 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
  8. 两个iphone怎么大量传照片_手机照片删除了怎么恢复?这两个简单方法一看就会,还不收藏?...
  9. 200725学习日报循环语句和数组
  10. 逃离裁员:程序员在云时代的生存之道