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\)个数,插入下一个数可 ...
随机推荐
- oracle分区表和分区索引概述
㈠ 分区表技术概述 ⑴ Range 分区 ① 例子 create table t (...列定义...) ...
- 交换两个变量的值不使用第三个变量(Java)
关于这个问题网上有好多答案,最近有人说这是个奇葩问题 个人测试了一把,如果是普通的数字的话,基本上没有问题 public static void main(String[] args) { int a ...
- linux kernel学习笔记-5内存管理_转
void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...
- NFS网络文件系统服务(配置实战)
NFS网络文件系统服务(实战) NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.让不同的主机系统(NFS的客户端)可以透明地读写位 ...
- 【Mac系统 + Git】之上传项目代码到github上以及删除某个文件夹
之前做开发的时候,用过一段时间git代码管理工具,用命令行操作感觉十分高大上,今天我想从头总结一篇Mac系统下如何利用git上传代码到github上的学习. 目录 一.安装Git 二.创建.ssh文件 ...
- 取消eclipse js验证
去掉Eclipse中的Validating 最近我的Eclipse一直经常效验javascript,我疯了校验了一个多小时还是在验.我只能在项目的.project文件中: 去掉.project文件中的 ...
- 重载(overload)、覆盖(override)和隐藏(hide)
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...
- 解决 ie 返回json提示下载 ResponseEntity方法
js 配合java springMVC后台,成功后返回消息,chrom ff都正常,只有IE提交后返回的JSON提示下载,查看类型 application/json google后发现原来是IE不 ...
- iptables的例子1
练习1:实现主机防火墙 设置主机防火墙策略为DROP: iptables -t filter -P INPUT DROP iptables -t filter -P OUTPUT DROP i ...
- php读写csv、xml文件: SimpleExcel
实例结构: 1. csv2xml.demo.php <?php use SimpleExcel\SimpleExcel; // 这句不能少! require_once ('../lib/Simp ...