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

题面

Description

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

Input

第一行为两个整数n,k。

Output

写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对10000求余数后的结果。

Sample Input

4 1

Sample Output

3

题解

考虑一下\(O(n^{3})\)

设\(f[i][j]\)表示\(i\)的排列中逆序对数为\(j\)的数列个数

现在,如果新加一个数\(i+1\)进来

他可以产生的贡献可以是\([0,i]\)

因此,\(f[i][j]=sum(f[i-1][j-k])\)

其中\(k∈[0,i-1]\)

但是这样子会重复算很多相同的东西

导致复杂度变为\(O(n^{3})\)

用一个前缀和记录一下,可以做到\(O(1)\)的转移

从而复杂度变为了\(O(n^{2})\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MOD 10000
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,K;
int f[1100][11000];
int s[11000];
int main()
{
n=read();K=read();
f[1][0]=1;
for(int i=2;i<=n;++i)
{
for(int j=1;j<=K+1;++j)s[j]=(s[j-1]+f[i-1][j-1])%MOD;
for(int j=0;j<=K;++j)
f[i][j]=(s[j+1]-s[max(j-i+1,0)]+MOD)%MOD;
}
printf("%d\n",f[n][K]);
return 0;
}

最新文章

  1. 我的LaTeX中文文档模板
  2. &lt;!DOCTYPE&gt;标签的定义与用法
  3. 激活Microsoft Office professional plus 2010
  4. 微信授权步骤与详解 -- c#篇
  5. Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)
  6. Android破解之Lic文件加密程序(首例)
  7. PHP文件漏桐可以通过对服务器进行设置和配置来达到防范目的
  8. PHP中关于 basename、dirname、pathinfo 详解
  9. UNIX基础知识之出错处理
  10. hdu 1106 排序
  11. TP手册学习第一天
  12. git的一些常见命令
  13. js、css动态压缩页面代码
  14. Sping AOP Capabilities and Goals
  15. 图解Redis之数据结构篇——链表
  16. 清除ul li里面的浮动并让ul自适应高度的一个好办法
  17. ASP.NET一个页面的生命周期
  18. 在EditText里输入小写字母时,将小写字母转化为大写显示
  19. Android 3D游戏开发
  20. Java中解压文件名有中文的rar包出现乱码问题的解决

热门文章

  1. LeetCode - 185. Department Top Three Salaries
  2. windows系统下安装node
  3. bzoj 2073 暴力
  4. Spring-mvc 静态资源不拦截
  5. PHP开发中多种方案实现高并发下的抢购、秒杀功能
  6. LeetCode第六天
  7. UVa 11988破损的键盘
  8. HDU - 1847 巴什博弈
  9. 【BZOJ3529】【SDOI2014】 数表
  10. openresty 中mime.types 文件缺失问题,无法展示图片