luogu2513 逆序对数列
我们令\(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 逆序对数列的更多相关文章
- bzoj2431:[HAOI2009]逆序对数列
单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...
- 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 ...
- 2431: [HAOI2009]逆序对数列
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 954 Solved: 548[Submit][Status ...
- 【BZOJ2431】逆序对数列(动态规划)
[BZOJ2431]逆序对数列(动态规划) 题面 Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组 ...
- P2513 [HAOI2009]逆序对数列
P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那 ...
- bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
http://www.lydsy.com/JudgeOnline/problem.php?id=2431 dp[i][j] 表示i的排列,有j个逆序对的方案数 加入i+1,此时i+1是排列中最大的数, ...
- BZOJ2431 HAOI2009 逆序对数列 【DP】*
BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai,如果有i<j且ai>aja_i>a_jai>aj,那么我们称aia ...
- 洛谷P2513 [HAOI2009]逆序对数列
P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易 ...
- bzoj2431: [HAOI2009]逆序对数列(前缀和优化dp)
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 2312 Solved: 1330[Submit][Stat ...
随机推荐
- I/O---读取txt文件----demo
首先获得一个文件句柄.File file = new File(); file即为文件句柄. 读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了.接下 ...
- web基础 (二) html标签
一.html是什么? 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然 ...
- FFmpeg结构体:AVInputFormat
1.描述 AVInputFormat 是类似COM 接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFormat 结构,在程序运行时有多个实例,位于avof ...
- apache http 跳到https
RewriteEngine OnRewriteCond %{HTTPS} !=onRewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
- 回调函数(callback)经典解答
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:常溪玲链接:http://www.zhihu.com/question/19801131/answer/13005983来源: ...
- WebRTC的拥塞控制技术<转>
转载地址:http://www.jianshu.com/p/9061b6d0a901 1. 概述 对于共享网络资源的各类应用来说,拥塞控制技术的使用有利于提高带宽利用率,同时也使得终端用户在使用网络时 ...
- URL网址参数解析类
/** * Created by myc on 2015/12/9. */ import android.text.TextUtils; import java.util.HashMap; impor ...
- myeclipse.ini
myeclipse10 32位 我的配置 #utf8 (do not remove) #utf8 (do not remove) -startup ../Common/plugins/org.ecli ...
- Using JConsole
Using JConsole 转自 https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html Th ...
- Codeforces 1137C Museums Tour (强连通分量, DP)
题意和思路看这篇博客就行了:https://www.cnblogs.com/cjyyb/p/10507937.html 有个问题需要注意:对于每个scc,只需要考虑进入这个scc的时间即可,其实和从哪 ...