我们令\(f[i][j]\)表示\(i\)的全排列中,逆序数为\(j\)的个数。

我们考虑在\(i-1\)的排列中插入\(i\)。\(k\)是这次更新会导致增加多少逆序数。

则\(\begin{aligned}{} f[i][j]=\sum_{k=0}^{\min(i-1,j)}f[i-1][j-k]\end{aligned}\)

自我感觉上面的写法不清真,所以换一个清真的等价写法。

\(\begin{aligned}{} f[i][j]=\sum_{k=max(0,j-i+1)}^{j}f[i-1][k]\end{aligned}\)

复杂度:\(O(nk^2)\),显然会tle。

我们观察这个式子,k是从0开始循环的,所以我们用前缀和优化dp。

我们开一个变量\(\begin{aligned}sum=\sum_{k=max(0,j-i+1)}^jf[i][k]\end{aligned}\)

每次j循环的时候让,把\(f[i-1][j]\)累加到\(sum\),然后让\(f[i][j]=sum\)即可

但\(sum\)的求和区间是长度为i的一段f数组,当\(j-i+1>=0\)的时候sum求和区间的左端点也要离开0,向右移动了,所以加一个右面的\(f[i-1][j]\),同时要判断sum的左端点是否大于0,如果是那么就减去左边的\(f[i-1][j-i+1]\)。(不理解?看下面)

欢迎收看新番:区间先生的旅程
这是我们的主人公[---]:区间先生,长度为5
[---]说他只是一个走过场的区间
t=0, ................
t=1, ]...............
t=2, -]..............
t=3, --].............
t=4, ---]............
t=5, [---]...........
t=6, .[---]..........//注意这里,区间先生的左端点脱离了0
t=7, ..[---].........//未完待续???
...
t=?, ...........[---]//因为我们只需要求到k,所以区间先生不用从右端离开,也就不用判断右端是否<=k了

这就是为什么要加一个if判断一下。

其实这个if可以放到前面的额不过懒得写了

复杂度:\(O(nk)\)

总结:以后我们发现有这种累加和的dp方程的时候可以考虑前缀和优化

代码

#include <cstdio>
#include <iostream> using namespace std; int n, k, p = 10000, f[1010][1010]; int main()
{
scanf("%d%d", &n, &k);
f[1][0] = 1;//初始条件,1的逆序为0,且只有1个排列
for (int i = 2; i <= n; i++)
{
int sum = 0;
for (int j = 0; j <= k; j++)
{
(sum += f[i - 1][j]) %= p;
f[i][j] = sum;
if(j >= i - 1)//如果j - i + 1>=0了,sum的求和区间左端点就>=0
(((sum -= f[i - 1][j - i + 1]) %= p)+= p) %= p;
}
}
printf("%d\n", f[n][k]);
return 0;
}

luogu2513 逆序对数列的更多相关文章

  1. bzoj2431:[HAOI2009]逆序对数列

    单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...

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

  3. 2431: [HAOI2009]逆序对数列

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 954  Solved: 548[Submit][Status ...

  4. 【BZOJ2431】逆序对数列(动态规划)

    [BZOJ2431]逆序对数列(动态规划) 题面 Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组 ...

  5. P2513 [HAOI2009]逆序对数列

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

  6. bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=2431 dp[i][j] 表示i的排列,有j个逆序对的方案数 加入i+1,此时i+1是排列中最大的数, ...

  7. BZOJ2431 HAOI2009 逆序对数列 【DP】*

    BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai​,如果有i<j且ai>aja_i>a_jai​>aj​,那么我们称aia ...

  8. 洛谷P2513 [HAOI2009]逆序对数列

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

  9. bzoj2431: [HAOI2009]逆序对数列(前缀和优化dp)

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2312  Solved: 1330[Submit][Stat ...

随机推荐

  1. 2014.12.22 几个有用的oracle正则表达式

    SELECT REGEXP_REPLACE('LSS12345', '[^0-9]') FROM DUAL 结果:12345 '[^0-9]'中的^表示‘非’上述表达式的含义是“将LSS12345中的 ...

  2. suse 源的添加与删除,以及源地址

    地址 一个是上海交大的,http://ftp.sjtu.edu.cn/opensuse/update/ 葡萄牙的: http://ftp.nux.ipb.pt/pub/dists/opensuse/u ...

  3. HDLM命令dlnkmgr详解之三__view

    view命令主要用于显示program information, path information, LU information, HBA port information, CHA port in ...

  4. BA 新web化 问题汇总

    1. 3D堆栈图在winform端无法显示,但在web端可以正常显示,说明与浏览器版本有关,在 IE 中设置文档模式为 IE8 即报错,IE9 却正常显示,可在 <head>节点下添加如下 ...

  5. opengl版本和扩展

    检查自己的OpenGL版本 可以很容易的知道自己系统中的OpenGL版本,方法就是调用glGetString函数. const char* version = (const char*)glGetSt ...

  6. java获取多个汉字的拼音首字母

    本文属于http://java.chinaitlab.com/base/803353.html原创!!! public class PinYin2Abbreviation { // 简体中文的编码范围 ...

  7. 解决iText+freemark导出pdf不支持base64的解决办法

    工具类: package test; import java.io.IOException ; import org.w3c.dom.Element ; import org.xhtmlrendere ...

  8. 恢复oracle的回收站的所有的表

    使用sys as sysdba 进入到sqlplus的控制界面 sqlplus / as sysdba 执行相关的命令,自动生成一个脚本文件 spool d:/a.sql select 'flashb ...

  9. 242. Valid Anagram 两个串的最基础版本

    [抄题]: Given two strings s and t, write a function to determine if t is an anagram of s. For example, ...

  10. ROS Learning-026 (提高篇-004 A Mobile Base-02) 控制移动平台 --- “分封制”

    ROS 提高篇 之 A Mobile Base-02 - 控制移动平台 - "分封制" 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ub ...