zoukankan      html  css  js  c++  java
  • hdu6348: 序列计数

    鉴于给定的排列是随机的。

    那么有一个结论,最长上升子序列是$sqrt n$级别的。

    那么我么就可以DP了。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define M 300
     4 #define MOD 1000000007
     5 int a[100010];
     6 int f[10010][310];
     7 int res[310];
     8 int n;
     9 int C[10010];
    10 inline void add(int x, int y) {
    11     for(int i = x; i <= n; i += (i & -i)) {
    12         C[i] += y;
    13         if(C[i] >= MOD) C[i] -= MOD;
    14     }
    15 }
    16 inline int query(int x) {
    17     int ret = 0;
    18     for(int i = x; i; i -= (i & -i)) {
    19         ret += C[i];
    20         if(ret >= MOD) ret -= MOD;
    21     }
    22     return ret;
    23 }
    24 int main() {
    25     int T;
    26     scanf("%d", &T);
    27     for(int Ca = 1; Ca <= T; ++ Ca) {
    28         scanf("%d", &n);
    29         int lim = min(M, n);
    30         /*for(int i = 0; i <= n; ++ i) {
    31             for(int j = 1; j <= lim; ++ j) {
    32                 f[i][j] = 0;
    33             }
    34         }*/
    35         for(int i = 1; i <= lim; ++ i) res[i] = 0;
    36         for(int i = 1; i <= n; ++ i) f[i][1] = 1;
    37         for(int i = 1; i <= n; ++ i) {
    38             scanf("%d", &a[i]);
    39         }
    40         for(int k = 2; k <= lim; ++ k) {
    41             for(int i = 1; i <= n; ++ i) C[i] = 0;
    42             for(int i = 1; i <= n; ++ i) {
    43                 f[i][k] = query(a[i] - 1);
    44                 add(a[i], f[i][k - 1]);
    45                 res[k] += f[i][k];
    46                 if(res[k] >= MOD) res[k] -= MOD;
    47             }
    48         }
    49         res[1] = n;
    50         printf("Case #%d: ", Ca);
    51         for(int i = 1; i <= lim; ++ i) {
    52             printf("%d", res[i]);
    53             if(i != lim || lim != n) {
    54                 printf(" ");
    55             }
    56         }
    57         for(int i = lim + 1; i <= n; ++ i) {
    58             printf("0");
    59             if(i != n) printf(" ");
    60         }
    61         puts("");
    62     }
    63 }
  • 相关阅读:
    压缩和还原压缩的JS代码
    mysql给某字段随机赋特定范围的整数值
    (五)绘制图像
    (四)旋转 缩放 位移 保存状态
    (三)描边 填充 绘制 开始路径 结束路径 绘制文本
    (二)导出图像
    (一)获取上下文绘图环境
    封装原生Ajax
    原生Ajax写法(GET)
    Angular跨域
  • 原文地址:https://www.cnblogs.com/iamqzh233/p/9478631.html
Copyright © 2011-2022 走看看