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> ...
随机推荐
- as3 加载gif loader
as3原生不支持gif动态图 loader 加载gif ,内容只是以bitmap加载进来 需要动态,另外衍生类: https://files.cnblogs.com/files/dt1991/GifL ...
- UI5-文档-4.16-Dialogs and Fragments
在这一步中,我们将进一步研究另一个可以用来组装视图的元素:the fragment. 片段是轻量级UI部件(UI子树),可以重用,但是没有任何控制器.这意味着,每当你想定义一个特定UI的一部分是跨多个 ...
- 迷你MVVM框架 avalonjs 1.3.6发布
本版本是一次重要的升级,考虑要介绍许多东西,也有许多东西对大家有用,也发到首页上来了. 本来是没有1.36的,先把基于静态收集依赖的1.4设计出来后,发现改动太多,为了平缓升级起见,才减少了一部分新特 ...
- MongoDB 数据查询
数据查询 基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty(): ...
- localstorage是什么,它有哪些作用
localStorage作为HTML5本地存储web storage特性的API之一,主要作用是将数据保存在客户端中,而客户端一般是指上海网站设计用户的计算机.在移动设备上,由于大部分浏览器都支持 w ...
- shell中交互输入自动化
shell中交互输入自动化 shell中有时我们需要交互,但是呢我们又不想每次从stdin输入,想让其自动化,这时我们就要使shell交互输入自动化了.这个功能很有用的哟.好好学习. 1 利用重 ...
- GO.db
相似的基因在不同物种中,其功能往往保守的.显然,需要一个统一的术语用于描述这些跨物种的同源基因及其基因产物的功能,否则,不同的实验室对相同的基因的功能的描述不同,将极大限制学术的交流.而 Gene O ...
- Intellij IDEA Debug
Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方 ...
- dubbo通信协议
对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况,本文参考dubbo官方文档 http://dubbo.io/User+Guide-zh.htm dubbo共支持如下几种通信协议: ...
- all any some
SQLServer中有三个关键字可以修改比较运算符:All.Any和Some,其中Some和Any等价. 他们作用于比较运算符和子查询之间,作用类似Exists.not exists.in.not i ...