BZOJ 2431 [HAOI2009]逆序对数列:dp 逆序对
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2431
题意:
给定n,k,问你有多少个由1~n组成的排列,使得逆序对个数恰好为k个。
题解:
表示状态:
dp[i][j] = num of sequences
i:已经用了1~i之间的数(在这一步放了数字i)
j:逆序对个数为j
找出答案:
ans = dp[n][k]
如何转移:
在当前这一步要放数字i。
所以要将i插入一个由1~i-1组成的排列中。
若将i插入位置x(0 <= x <= i-1),则新添的逆序对个数为x。
所以:
dp[i][j] = ∑ dp[i-1][j-x]
即:
dp[i][j] = ∑ dp[i-1][j-i+1 to j]
由于裸dp复杂度为O(N^3) = O(10^9),所以加一个前缀和优化。
边界条件:
dp[1][0] = 1
others = 0
AC Code:
// state expression:
// dp[i][j] = num of sequences
// i: considered number i
// j: there is j inversion pairs
//
// find the answer:
// ans = dp[n][k]
//
// transferring:
// dp[i][j] = sigma dp[i-1][j-i+1 to j]
//
// boundary:
// dp[1][0] = 1
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1005
#define MAX_K 1005
#define MOD 10000 using namespace std; int n,t;
int dp[MAX_N][MAX_K];
int sum[MAX_N][MAX_K]; void read()
{
cin>>n>>t;
} void update_sum(int i,int j,int a)
{
if(j==) sum[i][j]=a;
else sum[i][j]=(sum[i][j-]+a)%MOD;
} int query_sum(int i,int x,int y)
{
if(x==) return sum[i][y];
else return ((sum[i][y]-sum[i][x-])%MOD+MOD)%MOD;
} void solve()
{
memset(dp,,sizeof(dp));
memset(sum,,sizeof(sum));
dp[][]=;
for(int i=;i<=t;i++)
{
sum[][i]=;
}
for(int i=;i<=n;i++)
{
for(int j=;j<=t;j++)
{
dp[i][j]=query_sum(i-,max(,j-i+),j);
update_sum(i,j,dp[i][j]);
}
}
} void print()
{
cout<<dp[n][t]<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 2431 [HAOI2009]逆序对数列:dp 逆序对的更多相关文章
- BZOJ 2431: [HAOI2009]逆序对数列( dp )
dp(i,j)表示1~i的全部排列中逆序对数为j的个数. 从1~i-1的全部排列中加入i, 那么可以产生的逆序对数为0~i-1, 所以 dp(i,j) = Σ dp(i-1,k) (j-i+1 ≤ k ...
- BZOJ 2431 逆序对数列 DP
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列{ai},如果有i< j且ai> ...
- BZOJ 2431: [HAOI2009]逆序对数列【dp】
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序 ...
- Bzoj 2431 HAOI2009 逆序对数列
Description 对于一个数列{ai},如果有i**<**j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数. ...
- [bzoj 2431][HAOI2009]逆序对数列(递推+连续和优化)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2431 分析: f(i,j)表示前i个数字逆序对数目为j时候的方案数 那么有f(i,j) ...
- BZOJ2431:[HAOI2009]逆序对数列(DP,差分)
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...
- 【bzoj2431】[HAOI2009]逆序对数列 dp
题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这 ...
- [bzoj2431][HAOI2009][逆序对数列] (dp计数)
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...
- 【BZOJ2431】【HAOI2009】逆序对数列 DP
题目大意 问你有多少个由\(n\)个数组成的,逆序对个数为\(k\)的排列. \(n,k\leq 1000\) 题解 我们考虑从小到大插入这\(n\)个数. 设当前插入了\(i\)个数,插入下一个数可 ...
随机推荐
- 一家O2O社区App公司的随笔
近两年,O20是业内最火爆的关键词之一,去年拿到1亿天使投资的叮咚小区都引起了各方的关注. 一个月之前我入职了一家以做O2O社区产品的创业公司,此文会把这段时间和后边所见所想都写出来,总结创业公司和创 ...
- php给图片添加文字水印方法汇总
在php中要给图片加水印我们需要给php安装GD库了,这里我们不介绍GD库安装,只介绍怎么利用php给图片添加文字水印的4种方法的汇总.有需要的小伙伴可以参考下. 1: 面向过程的编写方法 1 2 3 ...
- 在jfinal的Controller中接受json数据
JFinal中接收URL中的参数或者model中的参数是很方便的,但是对于web2.0的网站来说,经常会以json方式提交比较复杂的数据,比如一个查询,包含了各种过滤条件和排序分页,前端脚本可能提交的 ...
- mac 编译ffmpeg真简单!
brew info ffmpeg 有安装选项,并且会提示依赖库安装状态 安装依赖库 brew install automake fdk-aac git lame libass libtool libv ...
- strpos 判断字符串是否存在
strpos 中为什么要用逗号隔开的原因是因为 防止找出相匹配的中 , 如 查找1 而数组中 存在 12 那么这个结果也是可以找出来的 ,分别在1 前后加个, 就是为了区 ...
- vue实践---根据不同环境,自动转换请求的url地址
一般的项目环境分为:本地环境,测试环境,预发环境,正式环境. 这些环境的域名一般是一样的, 前端请求接口的url也会随着这些环境的变化而改变,手动修改有点麻烦,所以想个办法,让请求的地址根据域名改变而 ...
- unity一些知识
有一个问题就是在Inspector面板修改 WheelNumber的数值后,运行项目,当项目停止的时候,WheelNumber 的数据又回到以前的数据,(数据未保存成功,数据丢失) 解决办法需要在 修 ...
- Unity3d 摇杆奖励
单个单元: publicclass RockerSingle : MonoBehaviour { // 枚举.类别 RockerType rockerType; //是否有效,最上面的为无效,即为f ...
- SpringMVC拦截器实现登录认证
项目结构如图: 需要的jar:有springMVC配置需要的jar和jstl需要的jar SpringMVC包的作用说明: aopalliance.jar:这个包是AOP联盟的API包,里面包含了针对 ...
- nginx学习之进程控制篇(三)
1. 进程 nginx有一个master进程和一个或多个工作进程. master process worker process or master process worker process wor ...