巧妙的转化;f前两维大小开反TLE了一发……

如果一个序列的相邻两项差的绝对值小于等于1,那么我们说这个序列是完美的。

给出一个有序数列A,求有多少种完美序列排序后和数列A相同。

Input

第一行一个数n(<=30000)表示完美序列的长度
第二行n个数,表示数列A(每个数<=10^9,每个数出现次数<=100)

Output

仅包含一个整数,表示可能的方案总数(对1,000,000,007取模)

题目分析

暑假讲过的题,今天第一眼还以为是什么玄妙计数……

因为从左到右构造不现实,于是考虑将数字从小到大构造。这样的好处在于现在插入的$i$只和上一次$i-1$的状态有关系。

$f[i][j][0/1][0/1]$表示处理到第$i$个数,第$i-1$个数两两间存空$j$个,左右两边分别是否有第$i-1$个数。转移的话就是用组合数统计,记得要预处理组合数。

所以总时间复杂度$O(n*4*100)$.

 #include<bits/stdc++.h>
const int MO = ;
const int maxn = ; int f[maxn][][][];
int fac[],C[][];
int n,m,ans,a[maxn],t[maxn]; int read()
{
char ch = getchar();
int num = ;
for (; !isdigit(ch); ch=getchar());
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num;
}
int qmi(int a, int b)
{
int ret = ;
while (b)
{
if (b&) ret = 1ll*ret*a%MO;
a = 1ll*a*a%MO, b >>= ;
}
return ret;
}
inline void Add(int &x, int y){x = (x+1ll*y)%MO;}
int main()
{
n = read(), fac[] = ;
for (int i=; i<=n; i++) a[i] = read();
for (int i=; i<=; i++) fac[i] = 1ll*fac[i-]*i%MO;
for (int i=; i<=; i++)
for (int j=; j<=i; j++)
C[i][j] = 1ll*fac[i]*qmi(1ll*fac[j]*fac[i-j]%MO, MO-)%MO;
for (int i=, j=; i<=n; i++)
{
while (j<=n&&a[i]==a[j+]) j++;
if (a[i]+ < a[j+]){
puts("");
return ;
}
t[++m] = j-i+, i = j;
}
f[][t[]-][][] = ;
for (int i=; i<m; i++)
for (int j=; j<t[i]; j++)
for (int s1=; s1<=; s1++)
for (int s2=; s2<=; s2++)
if (f[i][j][s1][s2])
for (int k=; k<=j; k++)
for (int l1=; l1<=s1; l1++)
for (int l2=; l2<=s2; l2++)
if (k+l1+l2&&t[i+] >= k+l1+l2)
Add(f[i+][t[i+]-k-l1-l2][l1][l2], 1ll*f[i][j][s1][s2]*C[j][k]%MO*C[t[i+]-][k+l1+l2-]%MO);
for (int i=; i<=; i++)
for (int j=; j<=; j++)
for (int k=; k<=; k++)
Add(ans, f[m][i][j][k]);
printf("%d\n",ans);
return ;
}

END

【动态规划】51nod1780 完美序列的更多相关文章

  1. 【BZOJ】1006: [HNOI2008]神奇的国度 弦图消除完美序列问题

    1006: [HNOI2008]神奇的国度 Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则. 他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的 ...

  2. 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )

    1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...

  3. js动态规划---最长子序列(lcs)

    function LCS(wordX, wordY) { var m = wordX.length; var n = wordY.length; this.lcs = function(){ var ...

  4. 【51Nod】1510 最小化序列 贪心+动态规划

    [题目]1510 最小化序列 [题意]给定长度为n的数组A和数字k,要求重排列数组从而最小化: \[ans=\sum_{i=1}^{n-k}|A_i-A_{i+k}|\] 输出最小的ans,\(n \ ...

  5. 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列

    隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态 ...

  6. hdu 4512 吉哥系列故事——完美队形I【LCIS经典应用】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4512 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  7. 动态规划 Dynamic Programming 学习笔记

    文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...

  8. NOIP2017提高组模拟赛 7(总结)

    NOIP2017提高组模拟赛 7(总结) 第一题 斯诺克 考虑这样一个斯诺克球台,它只有四个袋口,分别在四个角上(如下图所示).我们把所有桌子边界上的整数点作为击球点(除了4个袋口),在每个击球点我们 ...

  9. 【ZOJ】1015 Fishing Net

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1015 题意:给出一个n个点的无向图,询问是否为弦图,弦图定义为对于图中任意 ...

随机推荐

  1. How to generate a CSR in Microsoft IIS 7

    How to generate a CSR in Microsoft IIS 7 To help you generate your CSR for Microsoft IIS 7 we've pre ...

  2. Ruby: Case表达式

    Ruby的case表达式有两种形式: 第一种形式接近于一组连续的if语句:它让你列出一组条件,并执行第一个为真的条件表达式所对应的语句. 第二种形式,在case语句的顶部指定一个目标,而每个when从 ...

  3. 6.Python初窥门径(小数据池,集合,深浅拷贝)

    Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的 ...

  4. HTML5----前段各种常见BUG

     1.在IE6下,DIV中的字会多出,并且自成一行,而且是原来的字. 这是注释bug,经典的ie6 bug.    说明:注释造成文字溢出是IE6的BUG,注释造成文字溢出与其位置有关,注释造成文字溢 ...

  5. 洛谷P4238【模板】多项式求逆

    洛谷P4238 多项式求逆:http://blog.miskcoo.com/2015/05/polynomial-inverse 注意:直接在点值表达下做$B(x) \equiv 2B'(x) - A ...

  6. 命令行下载工具 wget

    wget 是一个简单而强大的跨平台命令行下载工具,包括 Windows 也有对应的版本.全称 GNU Wget,属于 GNU 计划的一部分,自由软件.支持 HTTP.HTTPS 和 FTP 协议,可在 ...

  7. spark-2.2.0-bin-hadoop2.6和spark-1.6.1-bin-hadoop2.6发行包自带案例全面详解(java、python、r和scala)之Basic包下的JavaPageRank.java(图文详解)

    不多说,直接上干货! spark-1.6.1-bin-hadoop2.6里Basic包下的JavaPageRank.java /* * Licensed to the Apache Software ...

  8. gulp管理angular2项目 配置文件

    目录结构: projectName |_ src |_ app |_ index.html |_ main.ts |_ systemjs.config.js |_ gulpfile.js |_ pac ...

  9. Java基础:(三)运算

    一.参数传递 Java的参数是以值传递的形式传入方法中,而不是引用传递. 二.隐式类型转换 Java不能隐式执行向下转型,因为这会使精度降低:但是使用 += 运算符可以执行隐式类型转换. float ...

  10. java容器集合

    java 集合分为 Collection 和 Map 两大类 Collection 是 Java 集合框架的顶层接口,它是对容器类进行增.删.改.查的定义,同时继承了 Iterable 接口,具有对集 ...