2018.07.18 HAOI2009 逆序对数列(线性dp)
传送门
目前只会n2" role="presentation" style="position: relative;">n2n2的dp" role="presentation" style="position: relative;">dpdp做法。
设dp[i][j]" role="presentation" style="position: relative;">dp[i][j]dp[i][j]表示1" role="presentation" style="position: relative;">11~i" role="presentation" style="position: relative;">ii的排列逆序对为j" role="presentation" style="position: relative;">jj的方案数。显然这个东西是可以递推的。相当于将i" role="presentation" style="position: relative;">ii插入到1" role="presentation" style="position: relative;">11~i−1" role="presentation" style="position: relative;">i−1i−1的排列中,然后就可以从dp[i−1][k]" role="presentation" style="position: relative;">dp[i−1][k]dp[i−1][k]转移过来。
然后我们就惊奇的发现这个方法是O(n3)" role="presentation" style="position: relative;">O(n3)O(n3)的,显然会T" role="presentation" style="position: relative;">TT掉。
如何优化?
仔细观察会发现,dp[i][j]" role="presentation" style="position: relative;">dp[i][j]dp[i][j]是由dp[i−1]" role="presentation" style="position: relative;">dp[i−1]dp[i−1]的前缀和转移过来的,因此每次枚举i" role="presentation" style="position: relative;">ii之后,我们维护一个叫做sum" role="presentation" style="position: relative;">sumsum的东西来表示dp[i−1]" role="presentation" style="position: relative;">dp[i−1]dp[i−1]的前缀和然后就能O(n2)" role="presentation" style="position: relative;">O(n2)O(n2)转移了。
代码如下:
#include<bits/stdc++.h>
#define N 1005
#define mod 10000
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
return ans;
}
int dp[N][N],ans=0,n,k;
int main(){
n=read(),k=read();
memset(dp,0,sizeof(dp));
dp[1][0]=1;
for(int i=2;i<=n;++i){
ans=0;
for(int j=0;j<=k;++j){
ans=(ans+dp[i-1][j])%mod;
dp[i][j]=ans%mod;
if(j+1-i>=0)ans=(ans-dp[i-1][j-i+1]+mod)%mod;
}
}
printf("%d",dp[n][k]);
return 0;
}
2018.07.18 HAOI2009 逆序对数列(线性dp)的更多相关文章
- BZOJ2431 HAOI2009 逆序对数列 【DP】*
BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai,如果有i<j且ai>aja_i>a_jai>aj,那么我们称aia ...
- BZOJ 2431: [HAOI2009]逆序对数列【dp】
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序 ...
- 【BZOJ 2431】 [HAOI2009] 逆序对数列 (DP)
Description 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数 ...
- [luogu2513 HAOI2009] 逆序对数列 (计数dp)
题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? ...
- bzoj2431: [HAOI2009]逆序对数列(DP)
f[i][j]前i个数有j个逆序对的数量 f[i][j]=sigma(f[i-1][j-k]){1<=k<=i} 维护一个前缀和即可 #include<iostream> #i ...
- 【洛谷 P2513】 [HAOI2009]逆序对数列(DP)
题目链接 这种求方案数的题一般都是\(dp\)吧. 注意到范围里\(k\)和\(n\)的范围一样大,\(k\)是完全可以更大的,到\(n\)的平方级别,所以这暗示了我们要把\(k\)写到状态里. \( ...
- BZOJ 2431 [HAOI2009]逆序对数列:dp 逆序对
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2431 题意: 给定n,k,问你有多少个由1~n组成的排列,使得逆序对个数恰好为k个. 题解 ...
- [luoguP2513] [HAOI2009]逆序对数列(DP)
传送门 f[i][j]表示前i个数,逆序对数为j的答案 则DP方程为: f[1][0] = 1; for(i = 2; i <= n; i++) for(j = 0; j <= m; j+ ...
- bzoj2431:[HAOI2009]逆序对数列
单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...
随机推荐
- J2SE 8的集合
List ArrayList查询效率高LinkedList插入删除效率高 ArrayList ArrayList<String> arrayList = new ArrayList< ...
- 如何给echarts图表添加下载图表成图片的功能
先打开一个现成的图表效果图,注意图中圈出的地方,如图 打开源码找到option,如图 在option下添加toolbox,如图 在toolbox下添加feature,如图 在featu ...
- VBA 编写类
一.初识类 现在,请打开你的VBE,主菜单-插入-类模块. 插入了一个类模块,也就建立了一个类.类模块的名字就是类的名字.你现在看到的,她的名字叫“类1”,这是VBA按她姐妹排行给她取的的,是的,VB ...
- dir 使用,统计文件数量
dir /b /a-d | find /v /c "$$$$" >1.log--※ 来源:·水木社区 newsmth.net·[FROM: 125.46.17.*] 今天去水 ...
- 有名管道FIFO
管道和FIFO的特征之一是它们的数据是一个字节流.这是UNIX的原生I/O模型.进程往其中写入的是字节流,系统不对它作解释. FIFO不存数据,只是通过它找到内核文件. 一.建立有名管道 1.命令mk ...
- Linux下php5.3.3安装mcrypt扩展
具体操作: 一.下载软件包 1.下载php(版本要与系统安装的一致) http://pan.baidu.com/s/1mifTbfE 2.下载libmcrypt(安装mcrypt需要此软件包) htt ...
- t检验,T Test (Student’s T-Test)
1.什么是T test? t-test:比较数据的均值,告诉你这两者之间是否相同,并给出这种不同的显著性(即是否是因为偶然导致的不同) The t test (also called Student’ ...
- 第五章 二叉树(e4)层次遍历
- jQuery对象转换为DOM对象(转)
jQuery对象转换为dom对象 只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的 ...
- 【校招面试 之 C/C++】第4题 拷贝构造函数被调用的3个时机
1.被调用的3个时机: (1)直接初始化或拷贝初始化: (2)将一个对象作为一个实参传递,形参采用非指针或非引用的对象进行接收时(指针即指向了同一块空间,并未实现拷贝:而引用就是实参本身): (3)函 ...