bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
http://www.lydsy.com/JudgeOnline/problem.php?id=2431
dp[i][j] 表示i的排列,有j个逆序对的方案数
加入i+1,此时i+1是排列中最大的数,
所以放在i+1后面的所有数都会与i+1形成逆序对
转移方程:dp[i][j]=Σ dp[i-1][j-k] k∈[0,min(j,i-1)]
前缀和优化
朴素的DP
#include<cstdio>
#include<algorithm> using namespace std; const int mod=; int dp[][]; int main()
{
int n,k;
scanf("%d%d",&n,&k);
dp[][]=;
int m;
for(int i=;i<=n;++i)
{
dp[i][]=;
m=min(i*(i-)/,k);
for(int j=;j<=m;++j)
for(int k=;k<=i- && k<=j;++k)
dp[i][j]=(dp[i][j]+dp[i-][j-k])%mod;
}
printf("%d",dp[n][k]);
}
前缀和优化:
#include<cstdio>
#include<algorithm> using namespace std; const int mod=; #define N 1001 int dp[N][N],sum[N][N]; int main()
{
int n,k;
scanf("%d%d",&n,&k);
dp[][]=;
for(int i=;i<=k;++i) sum[][i]=;
int m;
for(int i=;i<=n;++i)
{
dp[i][]=;
sum[i][]=;
m=min(i*(i-)/,k);
for(int j=;j<=m;++j)
{
if(j<min(j,i-)+) dp[i][j]=sum[i-][j];
else dp[i][j]=sum[i-][j]-sum[i-][j-min(j,i-)-];
if(dp[i][j]<) dp[i][j]+=mod;
sum[i][j]=sum[i][j-]+dp[i][j];
if(sum[i][j]>) sum[i][j]-=mod;
}
for(int j=i*(i-)/+;j<=k;++j) sum[i][j]=sum[i][j-];
}
printf("%d",dp[n][k]);
}
2431: [HAOI2009]逆序对数列
Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 2444 Solved: 1422
[Submit][Status][Discuss]
Description
Input
第一行为两个整数n,k。
Output
写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对10000求余数后的结果。
Sample Input
Sample Output
样例说明:
下列3个数列逆序对数都为1;分别是1 2 4 3 ;1 3 2 4 ;2 1 3 4;
100%的数据 n<=1000,k<=1000
bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列的更多相关文章
- BZOJ2431 HAOI2009 逆序对数列 【DP】*
BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai,如果有i<j且ai>aja_i>a_jai>aj,那么我们称aia ...
- bzoj2431: [HAOI2009]逆序对数列(前缀和优化dp)
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 2312 Solved: 1330[Submit][Stat ...
- bzoj2431: [HAOI2009]逆序对数列
dp. f[i][j]表示放置第i个数有j个逆序对的方案数. s[i][j]维护前缀和(f[i][0]~f[i][j]). 状态转移方程 f[i][j]=s[i-1][j]-s[i-1][max(j- ...
- BZOJ2431:[HAOI2009]逆序对数列(DP,差分)
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...
- bzoj2431: [HAOI2009]逆序对数列(DP)
f[i][j]前i个数有j个逆序对的数量 f[i][j]=sigma(f[i-1][j-k]){1<=k<=i} 维护一个前缀和即可 #include<iostream> #i ...
- [bzoj2431][HAOI2009][逆序对数列] (dp计数)
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...
- bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...
- BZOJ2431 HAOI2009逆序对数列(动态规划)
对于排列计数问题一般把数按一个特定的顺序加入排列.这个题做法比较显然,考虑将数从小到大加入排列即可. #include<iostream> #include<cstdio> # ...
- [BZOJ2431][HAOI2009]逆序对数列(DP)
从小到大加数,根据加入的位置转移,裸的背包DP. #include<cstdio> #include<cstring> #include<algorithm> #d ...
随机推荐
- 作业3//Calculator::1
计算器 作业博客 github 1.扯淡 代码其实是在十几号时打的,花了半晚上加半个下午.但是懒得打随笔,所以到现在才完成. 我的课程里没找到queue,是百度照着瞎打的. 2.总结 不大理解要求,S ...
- 乱码之UTF-8 &GBK
在提交JSP时对于乱码问题,首先我们要搞清楚为什么会出现乱码? 看JSP的头文件:<%@ page contentType="text/html;charset=UTF-8" ...
- ns3 回调机制
(1)目的:为了实现两个模块之间的通信(这两个模块没有任何依赖关系) (2) C语言中的函数指针 int (*a)(int q) = 0; //声明一个函数指针a,初始值设为0 //. //. //. ...
- thinkphp学习3-模板与视图
1.模板赋值 如果要在模板中输出变量,必须在在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值. $this->assign('na ...
- 如何快速地编写和运行一个属于自己的 MapReduce 例子程序
大数据的时代, 到处张嘴闭嘴都是Hadoop, MapReduce, 不跟上时代怎么行? 可是对一个hadoop的新手, 写一个属于自己的MapReduce程序还是小有点难度的, 需要建立一个mave ...
- js学习1
js基础1: js组成: ECMAScript :解释器 .翻译 提供语言的基本功能 几乎没有兼容型问题 dom :document object model 有一些兼容型问题 bom :brower ...
- SQLSERVER 使用XP开头的系统默认存储过程
1. 根据官网上面的内容进行执行命令 EXEC xp_cmdshell 'dir *.exe'; 但是会报错 消息 ,级别 ,状态 ,过程 xp_cmdshell,行 [批起始行 ] SQL Serv ...
- QT源码解析(七)Qt创建窗体的过程,作者“ tingsking18 ”(真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法)
前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用关系,效率实在是太低了,最近总结出一个更简便的方法, ...
- BZOJ3240 NOI2013矩阵游戏(数论)
必修五题. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cmath> ...
- MySQL/Oracle/SQL Server默认端口、JDBCdriver、Url
sqlserver默认端口号为:1433URL:"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname"DRI ...