题意:对于1 - n的一个排列a,计算上升序列长度为1,2,....,n的序列的种类

分析:

(1)上升子序列问题,注意到与一般最长上升子序列问题不同的是(1) 计算各个长度的序列种类 (2) 只是1-n的排列

(2)容易想到的是先计算长度为i的以a[j]结尾的种类,记为dp[i][j],则dp[i][j] = (dp[i-1][k] + dp[i][j]) (当a[j] > a[k]且 j > k),

       但是复杂度有 O(n ^ 3)

(3)思考优化:a只是1-n的排列,需要利用好这一特殊性

先思考能否从O(n^3) ---> O(n^2),则需要去掉转移方程中的k,也就是能否直接得到长度为i-1,结尾a[k]< a[j]且k < j的

      上升子串的种类,也就是位于a[j]左边的满足长度为i-1,a[k] < a[j]的上升子串种类。

    "位于左边的"容易实现,因为从左往右遍历,一边遍历一边计算上一轮长度位i-1的结果,此时"长度为i-1"这一条件也

   就满足了。不容易满足的是"a[k] < a[j]"这一条件,因为是1-n的排列,a[j]的范围有限,可以采用前缀和的思想,引入

   sum[]数组,sum[j]表示"a[k] <= a[j]"且满足其他两个条件的上升子串种类,但是sum[j]需要是动态更新的,必须从左往

   右一边更新一边计算,可以想到,利用树状数组可以解决这一问题

#include <iostream>
#include <cstdio>
#include <cstring>
#define MOD 1000000007using namespace std;
long long dp[10050];
long long C[10050];
int a[10050];
long long ans[10050];
int n;
int lowbit(int x) {return x & (-x);
}
long long sum(int x) {long long ret = 0;while (x > 0) {ret = (ret + C[x]) % MOD;x -= lowbit(x);}return ret;
}
void add(int x,long long d) {while (x <= n) {C[x] = (C[x] + d) % MOD;x += lowbit(x);}
}
int main() {int T;int N;int t = 1;scanf("%d",&T);while (t <= T) {scanf("%d",&N);n = N;for (int i = 1;i <= N;i++) {scanf("%d",&a[i]);}//初始化memset(dp,0,sizeof(dp));memset(C,0,sizeof(C));memset(ans,0,sizeof(ans));for (int i = 1;i <= N;i++) {dp[i] = 1;} for (int i = 2;i <= N;i++) {memset(C,0,sizeof(C));for (int j = 1;j <= N;j++) {add(a[j],dp[j]);dp[j] = 0;dp[j] = (dp[j] + sum(a[j] - 1)) % MOD;ans[i] = (ans[i] + dp[j]) % MOD;} //若ans[i]为0,ans[i + 1]一定为 0, if (ans[i] == 0) {break;}}printf("Case #%d:",t++);ans[1] = N; for (int i = 1;i <= N;i++) {printf(" %d",ans[i]);} printf("\n");}return 0;
} 

      

转载于:https://www.cnblogs.com/akira123/p/9601746.html

hdu 6348 序列计数相关推荐

  1. 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]

    序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB [Submit][Status][Discuss] Description Alice想要得到一个长度为n的 ...

  2. 序列计数(动态规划/自动机/前缀和优化)

    序列计数 对于一个小写字母的序列每次可以将相邻两个不同的小写字母都变为二者之一,可以进行无限次这样的操作,求解可以产生多少种不同的序列. 首先我们不能考虑操作,而是考虑合法序列,显然最后会形成若干个区 ...

  3. bzoj 4818: [Sdoi2017]序列计数(DP+矩阵快速幂)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 769  Solved: 463 [Submit][Stat ...

  4. HDU 5701 中位数计数(思维+暴力)

    中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submis ...

  5. HDU 4408 最小生成树计数详细解释

    一些blog看我的好迷,假解释看哭我了,这是我自己的理解,一道题看1天.菜哭 HDU 4408 无向图的最小生成树计数原理 就是在kruskal处理边的时候不断地找到联通块(由多个同长度的边组成的联通 ...

  6. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

  7. Bzoj4818--Sdoi2017序列计数

    Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数中,至少有一个数是质数.Alice想知道,有多少个 ...

  8. 蓝桥杯 - 序列计数(记忆化搜索)

    问题描述 小明想知道,满足以下条件的正整数序列的数量: 1. 第一项为 n: 2. 第二项不超过 n: 3. 从第三项开始,每一项小于前两项的差的绝对值. 请计算,对于给定的 n,有多少种满足条件的序 ...

  9. hdu 5256 序列变换 (LIS变形)

    序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

最新文章

  1. 为何苹果为何苹果甘愿冒险自主研发芯片?
  2. mysql中find_in_set()函数的使用
  3. AWS — AWS VPC 虚拟专用云
  4. 第4周实践项目1 建立单链表(非多组织结构)
  5. python大一知识点串讲_python-前20天的着重知识点
  6. Python3数字格式化代码示例
  7. MyEclipse 2014中 Window--customize perspective 功能 打不开的解决办法
  8. thinkcell插件_PPT大神私藏的5款插件,用好它们,小白也能快速做出精美的PPT
  9. 计算机师范专业考编,不是师范生考教师很难?这4个专业考教师反而轻松!
  10. 如何精简持仓基金数量?
  11. [渝粤教育] 中国地质大学 工程地质 复习题
  12. AllenNLP之入门解读代码
  13. 计算机设备统计报告,中国互联网络发展状况统计报告-中国科学院计算机网络信息中心.DOC...
  14. 2021-07-06淘宝,天猫超市
  15. Airtest 网易 UI 自动化工具 Airtest 浅用记录
  16. 阿里云镜像站repo文件
  17. 深度操作系统20.7正式发布
  18. 免费英文文献查询网站(生物医学) (转载)
  19. 古文摘抄(持续不定时更新)
  20. 教育培训学校的网络推广方案

热门文章

  1. burp proxy 过滤_burpsuite只拦截特定网站数据包教程
  2. java lua传参_Lua将函数参数作为表键传递
  3. php自动加载机制简述,PHP自动加载机制实例详解
  4. opencv方框内图像保存_opencv 图像滤波(均值,方框,高斯,中值)
  5. 后台管理系统好用的UI框架
  6. 2019年前端开发10大战略性技术蓝图
  7. 华为AP3010DN-AGN升级为胖AP
  8. CentOS配置主机名和主机映射
  9. 部署腾讯云(CentOS6.6版本,jdk1.7+tomcat8+mysql)
  10. android 成长日记 3.关于Activity的用户体验提升办法和使用技巧说明