题目链接: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 逆序对的更多相关文章

  1. 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 ...

  2. BZOJ 2431 逆序对数列 DP

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列{ai},如果有i< j且ai> ...

  3. BZOJ 2431: [HAOI2009]逆序对数列【dp】

    Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序 ...

  4. Bzoj 2431 HAOI2009 逆序对数列

    Description 对于一个数列{ai},如果有i**<**j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数. ...

  5. [bzoj 2431][HAOI2009]逆序对数列(递推+连续和优化)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2431 分析: f(i,j)表示前i个数字逆序对数目为j时候的方案数 那么有f(i,j) ...

  6. BZOJ2431:[HAOI2009]逆序对数列(DP,差分)

    Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...

  7. 【bzoj2431】[HAOI2009]逆序对数列 dp

    题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这 ...

  8. [bzoj2431][HAOI2009][逆序对数列] (dp计数)

    Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...

  9. 【BZOJ2431】【HAOI2009】逆序对数列 DP

    题目大意 问你有多少个由\(n\)个数组成的,逆序对个数为\(k\)的排列. \(n,k\leq 1000\) 题解 我们考虑从小到大插入这\(n\)个数. 设当前插入了\(i\)个数,插入下一个数可 ...

随机推荐

  1. hbase的数据模型

    hbase类似bigTable是一个分布式的数据库,它是一个稀疏的,长期存储的,多维的,排序的映射表,这张表的索引是行关键字,列关键字,时间戳.hbase中的数据都是字符串,没有类型.         ...

  2. hive beeline 的server启动与连接

    启动hiveServer2 启动beeline之后 连接 !connect jdbc:hive2://localhost:10000/default 启动的时候连接 /beeline -u jdbc: ...

  3. 解决myeclipse10.x的Servers产生的at com.genuitec.eclipse.ast.deploy.core.Deployment.<init>(Unknown Source)错

    错误: java.lang.NullPointerException at com.genuitec.eclipse.ast.deploy.core.Deployment.<init>(U ...

  4. zabbix自动化监控三种方式

    1.agent自动注册2.sever端自动发现discovery3.zabbix api

  5. Mysql CAST()函数

      (1).CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型.以下例子用于将文本字符串'12'转换为整型: SELECT CAST('12' AS int) (2).返回 ...

  6. Cobbler部署之FAQ处理

    Cobbler报错处理 通过cobbler check检查出现的报错 红色标注为报错关键信息 9.1 报错一 # cobbler check httpd does not appear to be r ...

  7. php编译参数选项 具体参数含义可以用./configure --help来查看

    php编译参数选项  PHP_INSTALL_PATH=/data/web/php MYSQL_INSTALL_PATH=/data/web/mysql ./configure --prefix=${ ...

  8. 一篇文章彻底弄清ARC始末

    本文转载至 http://blog.csdn.net/allison162004/article/details/38758265 自动引用计数(ARC)是编译器的一个特色,提供了Objective- ...

  9. lua元表(简单例子)

    Set = {} Set.mt = {}--定义普通的表作为元表,为了避免命名污染直接放在Set内部 function Set.new(t) local set = {} setmetatable(s ...

  10. 九度OJ 1209:最小邮票数 (遍历)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2252 解决:741 题目描述: 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有1分,3分,3分,3分,4分五 ...