递推(DP) noip 模拟 不等数列
来源:互联网 发布:centos kernel devel 编辑:程序博客网 时间:2024/05/20 10:54
题目描述:
将 1到 n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“ >”和“ <”。问在所有排列中,有多少个排列恰好有 k 个“ <”。 答案对 2012 取模。
输入:
第一行 2 个整数 n,k。
输出:
一个整数表示答案。
样例输入:
5 2
样例输出:
66
数据范围:
对于 30%的数据: n <= 10对于 100%的数据: k < n <= 1000
简析:
显然这绝对不是一道暴力题。 很容易就能想到,从1到n将数字一个个添加进去,同时每添加一个数字,< 要么多一个,要么不变。因此,我们用数组f[i][j]表示前i个数字的所有排列中有j个<的排列个数。由于每添加一个数字只能增加一个<或者不增加,因此f[i][j]只能由f[i-1][j-1]和f[i-1][j]推出来。(f[i-1][j-1]考虑<增多的情况,f[i-1][j]考虑不变的情况)。 那么怎样添加可以使<增多呢?首先要明确一点:要添加进排列的数字一定比排列中所有的数字都大,因为我们是从1到n逐个添加的。然后,能够添加的位置有四个:1.第一个数字前,2.最后一个数字后( < 会增多),3.添加在>关系的两个数字间,3.添加在<关系的两个数字间。 来看一下后两种情况: 3.添加在>关系的两个数字间:
很明显,<符号多了一个。 4.添加在<关系的两个数字间:
很明显,<数目不变。 同样的,添加在最前面,<不变,添加在最后面会增多。 先看递推式再解释:f[i][j]=(f[i-1][j-1]*(i-j)%2012+f[i-1][j]*(j+1)%2012)%2012; 首先考虑f[i-1][j-1],很明显,这要求将i添加后<多一个,已知,每一种排列有j-1个<,对应的,就有(i-2-(j-1))=(i-j-1)个>,由此前的图可知将数字添加在有>两个数字间 会多一个<,因此f[i][j]+=f[i-1][j-1]*(i-j-1)。在考虑添加在末尾的情况,f[i][j]+=f[i-1][j-1]*(i-j-1)+f[i-1][j-1],合并为f[i-1][j-1]*(i-j)。 同样的,对于f[i-1][j]我们考虑<不变的情况,即添加在<关系的两个数字间或者最前面,易得为f[i-1][j]*(j+1)。 最后注意赋初值的问题。
#include<stdio.h>int f[1100][1100]; int n,k,i,j;int min(int x,int y){ return x>=y?y:x;}int main(){ scanf("%d%d",&n,&k); for(i=1;i<=n;i++){ f[i][0]=1; f[i][i-1]=1; //赋初值 } for(i=1;i<=n;i++){ int x=min(k,i-1); for(j=1;j<=x;j++){ if(!f[i][j]) f[i][j]=(f[i-1][j-1]*(i-j)%2012+f[i-1][j]*(j+1)%2012)%2012; } } printf("%d",f[n][k]);}
阅读全文
1 0
- 递推(DP) noip 模拟 不等数列
- NOIP2017模拟赛 不等数列(dp)
- NOIP模拟题 [递推][DP][搜索]
- 【NOIP模拟赛】 思维+离线+递推 数列(好题)
- 不等数列 (Dp插入e)
- NOIP模拟题[递推][并查集][DP]
- NOIP模拟题 [递推][优化][dp][线段树][离散]
- 2014-3-15-不等数列num(dp)
- 【NOIP 模拟题】中位数(规律+递推)
- 【NOIP 模拟题】求和 (打表找规律+递推)
- 【NOIP 模拟题】[T2]one(递推)
- 【NOIP 模拟题】[T1](递推+乱搞)
- 10.22 2017-57级模拟题 二分+并查集+MST+递推+DP+毒瘤noip
- NOIP-贪心,递推,枚举,模拟
- NOIP模拟(11.07)T1 数列求和
- 【noip模拟题】数列
- 【NOIP模拟】数列编辑器
- 【NOIP模拟赛】数列
- 集合框架(七) 枚举
- 【Java】ReentrantLock
- Nginx
- redis集群搭建与管理
- 书籍记录
- 递推(DP) noip 模拟 不等数列
- 算法基础之----直接交换排序
- 二级域名和一级域名的区别
- Linux学习笔记(8)-网络命令
- 关于UTC和CST
- postcss-pxtorem如何忽略单个属性
- 修改RenderTexture的size
- Memcached —— 下载、 配置、使用
- End-of-central-directory signature not found