博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HAOI2009][BZOJ2431] 逆序对数列
阅读量:5290 次
发布时间:2019-06-14

本文共 1161 字,大约阅读时间需要 3 分钟。

2431: [HAOI2009]逆序对数列

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 1115  Solved: 635
[ ][ ][ ]

Description

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

 

Input

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

 

 

 

Output

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

 

 

 

 

Sample Input

样例输入
4 1

Sample Output

样例输出
3
样例说明:
下列3个数列逆序对数都为1;分别是1 2 4 3 ;1 3 2 4 ;2 1 3 4;
测试数据范围
30%的数据 n<=12
100%的数据 n<=1000,k<=1000
 
分析:
对于插入到序列中的第i个数,他可能产生0~i-1个逆序对个数,所以f[i][j]可从f[i-1][j-0],f[i-1][j-1]...f[i-1][j-(i-1)]转移而来,即f[i][j]=sigma(f[i-1][j-k]),0<=k<=i-1。 O(N^2K)
维护前缀和优化O(NK)。
 
#include
#include
#include
#include
#include
#include
#include
using namespace std;int n,k,sum,f[1001][1001];int main(){ scanf("%d%d",&n,&k); for (int i=1;i<=n;i++) f[i][0]=1; for (int i=2;i<=n;i++) { sum=f[i-1][0]; for (int j=1;j<=k;j++) { if (j>=i) sum-=f[i-1][j-i]; //前缀和 是 j-i 不是 j-i+1 sum+=f[i-1][j]; f[i][j]=(sum+10000)%10000; } } printf("%d",f[n][k]); return 0;}

 

短短20几行代码纠结了一个多小时……还请教了黄学长才懂。

转载于:https://www.cnblogs.com/ws-fqk/p/4504287.html

你可能感兴趣的文章
【转】eclipse技巧2
查看>>
Vue.js组件之同级之间的通信
查看>>
javascript中的面向对象(一)
查看>>
Android计算器界面 TableLayout
查看>>
【软件工程】敏捷开发方法的总结
查看>>
路由器原理及作用以及交换机
查看>>
主流PC浏览器调研
查看>>
Linux权限管理 - 基本权限
查看>>
C语言初学 简单计算器计算加减乘除程序
查看>>
smali语法小结
查看>>
[python]-类的继承
查看>>
pkg-config 设置
查看>>
选择之后,不能再选择。分配之后,不能再分配
查看>>
修复Kaos的中文显示
查看>>
自学it18大数据笔记-第三阶段Spark-day03——会持续更新……
查看>>
HBase总结
查看>>
xcode 快捷键
查看>>
STM32 CubeMX 中如何查看系统时钟
查看>>
C# 操作excel
查看>>
IT不同子领域的必读书单
查看>>